2014-03-27 38 views
2

我已经看到了这个讲了很多最近,即使在编译为JavaScript,他们已经取代typeofitem.constructor.name使用构造函数名称作为类型的可靠程度如何?

如何可靠的是这并没有任何优点(除了阵列型的)新的编程语言 and cons?

这里有一个例子

var tmp = []; 

typeof tmp // object 

tmp.constructor.name // Array 

回答

2

name作为函数的性质是和即将到来的ES6标准的一部分,目前supported by all browsers expect IE。除此之外,使用内置对象应该没问题。

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

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

TL;博士:

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

1

这里是利弊把我的头顶部的列表:

1)浏览器支持。

菲利克斯克林的答案覆盖了它,非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值的类型错误。这大概可以通过使用:

foo != null && foo.constructor.name 

4)包装对象。

有一些边缘情况下typeof和item.constructor。名称返回冲突的结果:

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个属性检查快得多,但如果这个想法得到牵引它可能会得到更好的优化,以及。无论哪种方式,我无法想象这永远是你的应用程序的瓶颈。


总而言之,有不少缺点,我想不出一个强有力的理由来使用它。

相关问题