Есть ли метод, равный hasOwnProperty(), который может пройти цепочку прототипов?

Например у меня есть массив, давайте назовем его myArray где:

 var myArray = ['foo', 'bar']; 

даже если, myArray.join() вернусь 'foo,bar' чек myArray.hasOwnProperty('join'), вернусь false потому что просто hasOwnProperty() не будет пересекать цепь прототипа.

Есть ли способ сделать ту же функцию с возможностью прохождения цепочки прототипов?

PS: подойдет даже нестандартный метод.

2 ответа

Решение

Вы можете использовать in оператор.

Оператор in возвращает true для свойств в цепочке прототипов.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/in

Подобно:

if ('join' in myArray) {
  ...
}

Если вы хотите определить, доступен ли метод или свойство в объекте или в цепочке прототипов для объекта, вы можете использовать оператор in, цитируемый elclanrs.

Оператор in возвращает true для свойств в цепочке прототипов.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/in

В вашем примере вы могли бы написать

if ('join' in myArray) { // do something }

Если вы хотите определить тип свойства в цепочке прототипов, вы также можете использовать оператор typeof. Я не могу найти "простой английский" цитату, что это работает с операторами-прототипами, но если вы наберете следующее в консоли инструментов dev по вашему выбору:

var myArray = ['foo', 'bar']; typeof(myArray.join);

Это вернет "функцию", как и ожидалось, демонстрируя, что этот оператор работает с функциями и свойствами прототипа - и это я тоже могу подтвердить из своего опыта. Оператор typeof вернет одно из

"undefined", "объект", "логическое значение", "число", "строка"

Другие вопросы по тегам