Object.prototype.hasOwnProperty()

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

Синтаксис

obj.hasOwnProperty(prop)

Параметри

prop
Ім'я у вигляді рядка або символ властивості, яку потрібно перевірити.

Вертає

Булеве значення, яке вказує, чи є задана властивість особистою властивістю об'єкта.

Опис

Всі нащадки Object успадковують метод hasOwnProperty. Цей метод можна використовувати, щоб визначити, чи є вказана властивість особистою властивістю об'єкта; на відмінну від оператора in, цей метод не перевіряє властивість у ланцюзі прототипів об'єкта. Якщо об'єкт є масивом, то метод  hasOwnProperty може перевірити, чи існує індекс у масиві.

Примітка

hasOwnProperty повертає true, навіть якщо значення властивості дорівнює null або undefined.

o = new Object();
o.propOne = null;
o.hasOwnProperty('propOne');   // повертає true
o.propTwo = undefined;
o.hasOwnProperty('propTwo');   // повертає true

Приклади

Використання hasOwnProperty для перевірки існування властивості

Наступний приклад визначає, чи має об'єкт o властивість на ім'я prop:

o = new Object();
o.hasOwnProperty('prop');   // повертає false
o.prop = 'exists';
o.hasOwnProperty('prop');   // повертає true

Прямі властивості проти успадкованих

Наступний приклад демонструє різницю між прямими властивостями та успадкованими через ланцюг прототипів:

o = new Object();
o.prop = 'exists';
o.hasOwnProperty('prop');             // повертає true
o.hasOwnProperty('toString');         // повертає false
o.hasOwnProperty('hasOwnProperty');   // повертає false

Перебір властивостей об'єкта

Наступний приклад показує, як перебирати властивості об'єкта, не рухаючи успадковані властивості. Зауважте, що цикл for...in перебирає лише перелічувані властивості, тому не слід вважати, виходячи з відсутності неперелічуваних властивостей, показаних у циклі, що hasOwnProperty сам обмежений суто перелічуваними елементами (як у випадку з Object.getOwnPropertyNames()).

var buz = {
  fog: 'stack'
};

for (var name in buz) {
  if (buz.hasOwnProperty(name)) {
    console.log('це властивість (' +
      name + '). Значення: ' + buz[name]);
  }
  else {
    console.log(name); // toString або щось інше
  }
}

Використання hasOwnProperty в якості назви властивості

JavaScript не захищає ім'я властивості hasOwnProperty; як наслідок, якщо існує можливість, що об'єкт може мати властивість з цим ім'ям, то необхідно використовувати зовнішній метод hasOwnProperty, щоб отримати правильний результат:

var foo = {
  hasOwnProperty: function() {
    return false;
  },
  bar: 'Небезпечна зона'
};

foo.hasOwnProperty('bar'); // завжди повертає false

// Використаємо hasOwnProperty іншого об'єкта
// і викличемо його з 'this', рівним foo
({}).hasOwnProperty.call(foo, 'bar'); // true

// Також можна використати властивість hasOwnProperty
// з прототипа Object для цієї мети
Object.prototype.hasOwnProperty.call(foo, 'bar'); // true

Зауважте, що в останньому випадку не створюється нових об'єктів.

Специфікації

Підтримка браузерів

BCD tables only load in the browser

Див. також