如何确定本地JavaScript对象是否具有属性/方法?

如何确定本地JavaScript对象是否具有属性/方法?

问题描述:

我想这将是那么容易,因为:如何确定本地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类”〜属性/方法,还是有更好的方法来做到这一点?

首先,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

And it does work fine in Firefox

这只是巧合!通常你不能期望原型的方法也存在于构造函数中。

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

这几乎是正确的,只是你忘记了new,这是一个常见的JavaScript陷阱。简称为new Array().push[].push,会正确检查一个实例是否有你想要的方法。

正确的方法来检查,如果属性存在:

if ('property' in objectVar) 

.hasOwnProperty可以在阵列的proptotype进行访问,如果typeof不地道不够。

 

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