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

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

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

Специфікація Статус Коментар
ECMAScript Latest Draft (ECMA-262)
The definition of 'Object.prototype.hasOwnProperty' in that specification.
Draft
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Object.prototype.hasOwnProperty' in that specification.
Standard
ECMAScript 5.1 (ECMA-262)
The definition of 'Object.prototype.hasOwnProperty' in that specification.
Standard
ECMAScript 3rd Edition (ECMA-262) Standard Початкове визначення. Реалізоване у JavaScript 1.5.

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

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidFirefox for AndroidOpera for AndroidSafari on iOSSamsung InternetNode.js
hasOwnPropertyChrome Full support 1Edge Full support 12Firefox Full support 1IE Full support 5.5Opera Full support YesSafari Full support YesWebView Android Full support 1Chrome Android Full support 18Firefox Android Full support 4Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support 1.0nodejs Full support Yes

Legend

Full support  
Full support

Див. також