24

我认为这很容易:

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 对象的所有属性/方法返回为“未定义”。

.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"~上是否存在属性/方法有什么问题,或者有更好的方法吗?

4

4 回答 4

60

检查属性是否存在的正确方法:

if ('property' in objectVar)
于 2010-03-21T20:00:41.573 回答
34

首先, typeof 是一个运算符,而不是一个函数,所以你不需要括号。其次,访问对象的原型。

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

当您执行时,typeof Array.push您正在测试 Array 对象本身是否具有 push 方法,而不是 Array 的实例是否具有 push 方法。

于 2009-02-27T17:41:08.247 回答
8

.hasOwnProperty可以在数组的原型上访问,如果不够typeof惯用的话。


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

于 2010-04-19T22:14:26.253 回答
3

它在 Firefox 中运行良好

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

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

这几乎是正确的,除非你忘记了new,这是一个长期存在的 JavaScript 陷阱。new Array().push,或者[].push简而言之,将正确检查实例是否具有您想要的方法。

于 2009-02-27T17:54:26.017 回答