【问题标题】:How reliable is using the constructors name as type?使用构造函数名称作为类型有多可靠?
【发布时间】:2023-03-16 14:16:01
【问题描述】:

我最近经常看到这种情况,即使是在编译为 javascript 的新编程语言中,它们已将 typeof 替换为 item.constructor.name

这有多可靠,有没有优点(除了数组类型)和缺点?

这是一个例子

var tmp = [];

typeof tmp // object

tmp.constructor.name // Array

【问题讨论】:

    标签: javascript types constructor typeof


    【解决方案1】:

    name 作为函数的属性是即将到来的 ES6 标准的一部分,目前是supported by all browsers expect IE。除此之外,它应该可以用于内置对象。

    由用户定义的构造函数 OTOH 创建的对象可能没有正确的constructor 属性集,例如在使用继承但 constructor 的值未设置回构造函数的情况下:

    Child.prototype = Object.create(Parent.prototype);
    // Child.prototype.constructor = Child;
    

    tl;博士:

    内置对象和非 IE 浏览器:可靠
    第三方用户定义的构造函数或 IE:不可靠

    【讨论】:

      【解决方案2】:

      这是我脑海中的缺点列表:

      1) 浏览器支持。

      Felix Kling 的回答涵盖了这一点,非 IE 效果很好。 IE - 不是那么多,虽然我认为解决方法是可能的。

      2) 自定义构造函数

      var Foo = function(){};
      var foo = new Foo();
      console.log(foo.constructor.name); // empty string
      

      当然,这可以通过强制执行一种不允许构造函数是匿名函数的风格来缓解,或者发明一种疯狂的解决方法。

      var Foo = function Foo(){};
      
      function Bar(){};
      
      var Baz = function (){};
      Baz.name = 'Baz';
      

      3) 例外情况

      typeof 不会抛出异常。因此,它用于检查是否尚未定义变量:

      if (typeof baz === 'undefined') console.log('baz not defined');
      if (baz === undefined) console.log('Reference error instead!');
      

      更糟糕的是,检查 constructor.name 会为 null 和 undefined 值抛出 TypeError。这可能可以通过使用来缓解:

      foo != null && foo.constructor.name
      

      4) 包装对象。

      在某些极端情况下 typeof 和 item.constructor.name 返回冲突的结果:

      var foo = false;
      var bar = new Boolean(false);
      
      console.log(typeof foo);  // boolean
      console.log(typeof bar);  // object
      console.log(foo.constructor.name);  // Boolean
      console.log(bar.constructor.name);  // Boolean
      
      if (foo) console.log('No');
      if (bar) console.log('Yes');
      

      在少数情况下这些实际上很重要,以上几乎是最坏的情况。

      5) 速度

      我希望本地运算符比 2 次属性检查快得多,但如果这个想法得到关注,它也可能会得到更好的优化。无论哪种方式,我都无法想象这会成为您的应用程序的瓶颈。


      总而言之,有很多缺点,我想不出使用它的充分理由。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-22
        • 2010-11-02
        相关资源
        最近更新 更多