Object.prototype.hasOwnProperty()
Метод hasOwnProperty()
(має власну властивість) примірників Object
повертає булеве значення, котре вказує на те, чи має його об'єкт задану властивість як свою власну (але не успадковану).
Примітка:
Object.hasOwn()
є рекомендованою альтернативоюhasOwnProperty()
в тих браузерах, у котрих підтримується.
Спробуйте його в дії
Синтаксис
hasOwnProperty(prop)
Параметри
Повернене значення
Повертає true
, якщо об'єкт має задану властивість за власну; інакше – false
.
Опис
Метод hasOwnProperty()
повертає true
, якщо задана властивість є безпосередньою властивістю об'єкта, навіть якщо значенням цієї властивості є null
чи undefined
. Цей метод повертає false
, якщо властивість була успадкована чи не була оголошена взагалі. На відміну від оператора in
, цей метод не шукає задану властивість у ланцюжку прототипів об'єкта.
Цей метод можна викликати на більшості об'єктів JavaScript, адже більшість об'єктів походить від Object
, а отже – успадковують його методи. Наприклад, Array
– це також Object
, тому hasOwnProperty()
можна використовувати для перевірки існування індексу:
const fruits = ["Яблуко", "Банан", "Кавун", "Апельсин"];
fruits.hasOwnProperty(3); // true ('Апельсин')
fruits.hasOwnProperty(4); // false - не визначено
Цей метод не буде доступним на об'єктах, в котрих ця логіка заміщена, або на null
-прототипних об'єктах (адже вони не успадковують від Object.prototype
). Приклади таких випадків надані нижче.
Приклади
Використання hasOwnProperty для перевірки існування власної властивості
Наступний код демонструє, як можна з'ясувати, чи містить об'єкт example
властивість на ім'я prop
.
const example = {};
example.hasOwnProperty("prop"); // false
example.prop = "існує";
example.hasOwnProperty("prop"); // true - 'prop' була визначена
example.prop = null;
example.hasOwnProperty("prop"); // true - присутня власна властивість зі значенням null
example.prop = undefined;
example.hasOwnProperty("prop"); // true - присутня власна властивість зі значенням undefined
Безпосередні та успадковані властивості
Наступний приклад розрізняє безпосередні властивості та властивості, що були успадковані за ланцюжком прототипів:
const example = {};
example.prop = "існує";
// `hasOwnProperty` поверне true лише для безпосередніх властивостей:
example.hasOwnProperty("prop"); // повертає true
example.hasOwnProperty("toString"); // повертає false
example.hasOwnProperty("hasOwnProperty"); // повертає false
// Оператор `in` поверне true і для безпосередніх, і для успадкованих властивостей:
"prop" in example; // повертає true
"toString" in example; // повертає true
"hasOwnProperty" in example; // повертає true
Ітерування властивостей об'єкта
Наступний приклад демонструє, як можна ітерувати перелічувані властивості об'єкта, не обробляючи успадкованих властивостей.
const buz = {
fog: "stack",
};
for (const name in buz) {
if (buz.hasOwnProperty(name)) {
console.log(`це точно fog (${name}). Значення: ${buz[name]}`);
} else {
console.log(name); // toString чи щось іще
}
}
Зверніть увагу, що цикл for...in
ітерує лише перелічувані елементи: відсутність неперелічуваних властивостей, виведених у циклі, не означає, що сам hasOwnProperty
обмежений перелічуваними елементами. Ітерувати по неперелічуваних властивостях можна за допомогою Object.getOwnPropertyNames()
.
Використання hasOwnProperty як імені властивості
JavaScript не захищає ім'я властивості hasOwnProperty
; об'єкт, що має властивість з таким іменем, може повертати некоректні результати:
const foo = {
hasOwnProperty() {
return false;
},
bar: "Тут живуть дракони",
};
foo.hasOwnProperty("bar"); // власна реалізація завжди повертає false
Рекомендований спосіб розв'язати цю проблему – використовувати натомість Object.hasOwn()
(у тих браузерах, що це підтримують). Серед інших альтернатив – використання зовнішнього hasOwnProperty
:
const foo = { bar: "Тут живуть дракони" };
// Використання методу Object.hasOwn() – рекомендовано
Object.hasOwn(foo, "bar"); // true
// Використання властивості hasOwnProperty з прототипа Object
Object.prototype.hasOwnProperty.call(foo, "bar"); // true
// Використання hasOwnProperty іншого Object
// і виклик його з foo як 'this'
({}).hasOwnProperty.call(foo, "bar"); // true
Зверніть увагу, що у двох перших випадках нові об'єкти не створюються.
Об'єкти, створені за допомогою Object.create(null)
null
-прототипні об'єкти не успадковують від Object.prototype
, а отже – hasOwnProperty()
– недоступний.
const foo = Object.create(null);
foo.prop = "існує";
foo.hasOwnProperty("prop"); // Uncaught TypeError: foo.hasOwnProperty is not a function
Способи розв'язання цієї проблеми – такі самі, як в попередньому розділі: віддання переваги Object.hasOwn()
, або ж використання hasOwnProperty()
зовнішнього об'єкта.
Специфікації
Сумісність із браузерами
desktop | mobile | server | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
hasOwnProperty
|
Chrome Full support 1 | Edge Full support 12 | Firefox Full support 1 | Internet Explorer Full support 5.5 | Opera Full support 5 | Safari Full support 3 | WebView Android Full support 1 | Chrome Android Full support 18 | Firefox for Android Full support 4 | Opera Android Full support 10.1 | Safari on iOS Full support 1 | Samsung Internet Full support 1.0 | Deno Full support 1.0 | Node.js Full support 0.10.0 |