Функция hasOwnProperty¶
Если вам необходимо проверить, определено ли свойство у самого объекта, а не в его цепочке прототипов, вы можете использовать метод hasOwnProperty
, который все объекты наследуют от Object.prototype
.
Примечание: Для проверки наличия свойства недостаточно проверять, эквивалентно ли оно
undefined
. Свойство может вполне себе существовать, но при этом ему может быть присвоено значениеundefined
.
hasOwnProperty
— единственная функция в JavaScript, которая позволяет получить свойства объекта без обращения к цепочке его прототипов.
// испортим Object.prototype
Object.prototype.bar = 1
var foo = { goo: undefined }
foo.bar // 1
'bar' in foo // true
foo.hasOwnProperty('bar') // false
foo.hasOwnProperty('goo') // true
Только используя hasOwnProperty
можно гарантировать правильный результат при переборе свойств объекта. И нет иного способа для определения свойств, которые определены в самом объекте, а не где-то в цепочке его прототипов.
hasOwnProperty как свойство¶
JavaScript не резервирует свойство с именем hasOwnProperty
. Так что, если есть потенциальная возможность, что объект может содержать свойство с таким именем, требуется использовать внешний вариант функции hasOwnProperty
чтобы получить корректные результаты.
var foo = {
hasOwnProperty: function () {
return false
},
bar: 'Да прилетят драконы',
}
foo.hasOwnProperty('bar') // всегда возвращает false
// Используем метод hasOwnProperty пустого объекта
// и передаём foo в качестве this
;({}.hasOwnProperty.call(foo, 'bar')) // true
Заключение¶
Единственным способом проверить существование свойства у объекта является использование метода hasOwnProperty
. При этом рекомендуется использовать этот метод в каждом цикле for in
вашего проекта, чтобы избежать возможных ошибок с ошибочным заимствованием свойств из прототипов родительских объектов. Также вы можете использовать конструкцию {}.hasOwnProperty.call(...)
на случай, если кто-то вздумает расширить прототипы встроенных объектов.