Как определить, есть ли у собственного объекта 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
}
Есть ли что-нибудь неправильное в использовании этого синтаксиса, чтобы определить, существует ли свойство / метод в собственном объекте / ~ "классе JavaScript" ~ , или есть лучший способ сделать это?
Ответов (4)4
Прежде всего, typeof - это оператор, а не функция, поэтому скобки не нужны. Во-вторых, получить доступ к прототипу объекта.
alert( typeof Array.prototype.push );
alert( typeof Array.prototype.foo );
При выполнении typeof Array.push
вы проверяете, имеет ли сам объект Array метод push, а не экземпляры Array, имеющие метод push.
И он отлично работает в Firefox
Это только совпадение! Обычно нельзя ожидать, что метод прототипа также будет существовать в функции конструктора.
if(typeof(Array().push) == 'undefined')
Это было почти правильно, за исключением того, что вы забыли new
, извечная ошибка JavaScript. new Array().push
, или, [].push
для краткости, правильно проверит, что у экземпляра есть нужный вам метод.