2009-02-27 57 views
18

我想這將是那麼容易,因爲:如何確定本地JavaScript對象是否具有屬性/方法?

if(typeof(Array.push) == 'undefined'){ 
    //not defined, prototype a version of the push method 
    // Firefox never gets here, but IE/Safari/Chrome/etc. do, even though 
    // the Array object has a push method! 
} 

而且它在Firefox正常工作,但不是在IE,Chrome瀏覽器,Safari,Opera或,它們將返回所有屬性/原生的方法使用此測試將數組對象定義爲「未定義」。

.hasOwnProperty(prop)方法只適用於實例...所以它不起作用,但通過試驗和錯誤,我注意到這是有效的。

//this works in Firefox/IE(6,7,8)/Chrome/Safari/Opera 
if(typeof(Array().push) == 'undefined'){ 
    //not defined, prototype a version of the push method 
} 

有什麼錯誤使用這種語法,以確定是否存在一個本地對象/〜「JavaScript類」〜屬性/方法,還是有更好的方法來做到這一點?

回答

30

首先,typeof是一個操作符,而不是函數,所以你不需要括號。其次,訪問對象的原型。

alert(typeof Array.prototype.push); 
alert(typeof Array.prototype.foo); 

當你執行typeof Array.push正在測試如果數組對象本身具有推送方法,而不是是否陣列的實例具有推方法。

+0

有趣......我讀到.prototype只是爲了向對象添加新的屬性/方法,我沒有想到對它使用typeof。例如 prototype http://www.devguru.com/technologies/JavaScript/10764.asp typeof http://www.devguru.com/technologies/JavaScript/11529.asp – scunliffe 2009-02-27 18:41:25

+0

就是這樣,是的,但不僅限於此。我建議您在YUI Theatre(http://developer.yahoo.com/yui/theater/)上觀看道格拉斯克羅克福德關於「高級Javascript」的演示 - 那裏有一些很棒的「底層」東西,包括對象原型如何工作。 – 2009-02-27 19:53:32

+1

這將不會看到父代原型中定義的屬性 – 2011-11-30 23:47:52

2

And it does work fine in Firefox

這只是巧合!通常你不能期望原型的方法也存在於構造函數中。

if(typeof(Array().push) == 'undefined') 

這幾乎是正確的,只是你忘記了new,這是一個常見的JavaScript陷阱。簡稱爲new Array().push[].push,會正確檢查一個實例是否有你想要的方法。

51

正確的方法來檢查,如果屬性存在:

if ('property' in objectVar) 
8

.hasOwnProperty可以在陣列的proptotype進行訪問,如果typeof不地道不夠。

 

if (Array.prototype.hasOwnProperty('push')) { 
    // Native array has push property 
} 
 
相關問題