Как определить, имеет ли собственный объект 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, они возвращают все свойства/методы собственного объекта 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" ~, или есть лучший способ сделать это?

Ответ 1

Прежде всего, typeof является оператором, а не функцией, поэтому вам не нужны скобки. Во-вторых, обратитесь к прототипу объекта.

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

Когда вы выполняете typeof Array.push, вы проверяете, имеет ли объект Array метод push, а не если экземпляры массива имеют метод push.

Ответ 2

Правильный способ проверить, существует ли свойство:

if ('property' in objectVar)

Ответ 3

Доступ к .hasOwnProperty можно получить в прообразе Array, если typeof недостаточно идиоматичен.


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

Ответ 4

И он отлично работает в Firefox

Это только по совпадению! Обычно вы не можете ожидать, что метод прототипа также существует в функции конструктора.

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

Это было почти правильно, за исключением того, что вы забыли new, многолетний JavaScript-код. new Array().push или [].push для краткости, правильно проверили бы экземпляр, если бы вы хотели.