2014-03-27 37 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個屬性檢查快得多,但如果這個想法得到牽引它可能會得到更好的優化,以及。無論哪種方式,我無法想象這永遠是你的應用程序的瓶頸。


總而言之,有不少缺點,我想不出一個強有力的理由來使用它。

相關問題