Object.prototype.hasOwnProperty()

Метод hasOwnProperty() (має власну властивість) примірників Object повертає булеве значення, котре вказує на те, чи має його об'єкт задану властивість як свою власну (але не успадковану).

Примітка: Object.hasOwn() є рекомендованою альтернативою hasOwnProperty() в тих браузерах, у котрих підтримується.

Спробуйте його в дії

Синтаксис

hasOwnProperty(prop)

Параметри

prop

String з іменем або Symbol властивості до перевірки.

Повернене значення

Повертає 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
Chrome Edge Firefox Internet Explorer Opera Safari WebView Android Chrome Android Firefox for Android Opera Android Safari on iOS Samsung Internet Deno Node.js
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

Дивіться також