我认为这很简单:
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 中无效,它们将原生Array对象的所有属性/方法都返回为'undefined '使用这个测试。
.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
}
使用此语法确定 Native Object /〜“JavaScript Class”〜上是否存在属性/方法有什么问题,还是有更好的方法来执行此操作?
答案 0 :(得分:55)
检查属性是否存在的正确方法:
if ('property' in objectVar)
答案 1 :(得分:31)
首先,typeof是一个运算符,而不是一个函数,所以你不需要括号。其次,访问对象的原型。
alert( typeof Array.prototype.push );
alert( typeof Array.prototype.foo );
当你执行typeof Array.push
时,你正在测试Array对象本身是否有push方法,而不是Array的实例是否有push方法。
答案 2 :(得分:8)
如果.hasOwnProperty
不够惯用,可以在数组原型上访问typeof
。
if (Array.prototype.hasOwnProperty('push')) {
// Native array has push property
}
答案 3 :(得分:3)
它在Firefox中运行良好
这只是巧合!您通常不希望原型的方法也存在于构造函数中。
if(typeof(Array().push) == 'undefined')
这几乎是正确的,除了你忘了new
,这是一个常年的JavaScript问题。 new Array().push
或简称[].push
会正确检查具有您想要的方法的实例。