如何确定本地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
正在测试如果数组对象本身具有推送方法,而不是是否阵列的实例具有推方法。
答
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
}
有趣......我读到.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
就是这样,是的,但不仅限于此。我建议您在YUI Theatre(http://developer.yahoo.com/yui/theater/)上观看道格拉斯克罗克福德关于“高级Javascript”的演示 - 那里有一些很棒的“底层”东西,包括对象原型如何工作。 – 2009-02-27 19:53:32
这将不会看到父代原型中定义的属性 – 2011-11-30 23:47:52