Как определить, есть ли у Собственного объекта JavaScript свойство / метод? - PullRequest
19 голосов
/ 27 февраля 2009

Я думал, что это будет так же просто, как:

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 ]

55 голосов
/ 21 марта 2010

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

if ('property' in objectVar)
31 голосов
/ 27 февраля 2009

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

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

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

8 голосов
/ 20 апреля 2010

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


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

3 голосов
/ 27 февраля 2009

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

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

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

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

...