Spec-Zone.ru › JavaScript

Object.prototype.hasOwnProperty()

Базовая версия Широко доступно

Эта функция хорошо зарекомендовала себя и работает на множестве устройств и версий браузеров. Она доступна во всех браузерах с июля 2015 года.

Метод hasOwnProperty() экземпляров Object возвращает логическое значение, указывающее, имеет ли объект указанное свойство как собственное свойство (в отличие от унаследованного).

Примечание: Object.hasOwn() рекомендуется вместо hasOwnProperty() в браузерах, где он поддерживается.

Попробуйте

const object = {};
object.foo = 42;

console.log(object.hasOwnProperty("foo"));
// Expected output: true

console.log(object.hasOwnProperty("toString"));
// Expected output: false

console.log(object.hasOwnProperty("hasOwnProperty"));
// Expected output: false

Синтаксис

hasOwnProperty(prop)

Параметры

prop
Имя String или Symbol свойства для проверки.

Возвращаемое значение

Возвращает true, если объект имеет указанное свойство как собственное; false в противном случае.

Описание

Метод hasOwnProperty() возвращает true, если указанное свойство является прямым свойством объекта — даже если значение null или undefined. Метод возвращает false, если свойство унаследовано или вообще не объявлено. В отличие от оператора in, этот метод не проверяет указанное свойство в цепочке прототипов объекта.

Метод может быть вызван для *большинства* объектов JavaScript, поскольку большинство объектов наследуются от Object и, следовательно, наследуют его методы. Например, Array является Object, поэтому вы можете использовать метод hasOwnProperty() для проверки наличия индекса:

const fruits = ["Apple", "Banana", "Watermelon", "Orange"];
fruits.hasOwnProperty(3); // true ('Orange')
fruits.hasOwnProperty(4); // false - not defined

Метод не будет доступен в объектах, где он переопределен, или в объектах с прототипом null (поскольку они не наследуются от Object.prototype). Примеры таких случаев приведены ниже.

Примеры

Использование hasOwnProperty для проверки существования собственного свойства

Следующий код показывает, как определить, содержит ли объект example свойство с именем prop.

const example = {};
example.hasOwnProperty("prop"); // false

example.prop = "exists";
example.hasOwnProperty("prop"); // true - 'prop' has been defined

example.prop = null;
example.hasOwnProperty("prop"); // true - own property exists with value of null

example.prop = undefined;
example.hasOwnProperty("prop"); // true - own property exists with value of undefined

Прямые и унаследованные свойства

Следующий пример различает прямые свойства и свойства, унаследованные через цепочку прототипов:

const example = {};
example.prop = "exists";

// `hasOwnProperty` will only return true for direct properties:
example.hasOwnProperty("prop"); // true
example.hasOwnProperty("toString"); // false
example.hasOwnProperty("hasOwnProperty"); // false

// The `in` operator will return true for direct or inherited properties:
"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(`this is fog (${name}) for sure. Value: ${buz[name]}`);
  } else {
    console.log(name); // toString or something else
  }
}

Обратите внимание, что цикл for...in итерирует только по перечисляемым элементам: отсутствие неперечисляемых свойств, пропускаемых циклом, не означает, что hasOwnProperty сам по себе строго ограничен перечисляемыми элементами. Вы можете итерировать по неперечисляемым свойствам с помощью Object.getOwnPropertyNames().

Использование hasOwnProperty в качестве имени свойства

JavaScript не защищает имя свойства hasOwnProperty; объект, имеющий свойство с этим именем, может возвращать некорректные результаты:

const foo = {
  hasOwnProperty() {
    return false;
  },
  bar: "Here be dragons",
};

foo.hasOwnProperty("bar"); // re-implementation always returns false

Рекомендуемый способ преодолеть эту проблему — использовать Object.hasOwn() (в браузерах, которые его поддерживают). Другие альтернативы включают использование *внешнего* hasOwnProperty:

const foo = { bar: "Here be dragons" };

// Use Object.hasOwn() method - recommended
Object.hasOwn(foo, "bar"); // true

// Use the hasOwnProperty property from the Object prototype
Object.prototype.hasOwnProperty.call(foo, "bar"); // true

// Use another Object's hasOwnProperty
// and call it with 'this' set to foo
({}).hasOwnProperty.call(foo, "bar"); // true

Обратите внимание, что в первых двух случаях новые объекты не создаются.

Объекты, созданные с помощью Object.create(null)

Объекты с прототипом null не наследуются от Object.prototype, что делает hasOwnProperty() недоступным.

const foo = Object.create(null);
foo.prop = "exists";
foo.hasOwnProperty("prop"); // Uncaught TypeError: foo.hasOwnProperty is not a function

Решения в этом случае такие же, как и в предыдущем разделе: предпочтительно использовать Object.hasOwn(), в противном случае использовать hasOwnProperty() внешнего объекта.

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

Спецификация
ECMAScript® 2027 Language Specification
# sec-object.prototype.hasownproperty

Совместимость с браузерами

Desktop Mobile Server
Chrome Edge Firefox Opera Safari Chrome Android Firefox for Android Opera Android Safari on iOS Samsung Internet WebView Android WebView on iOS Bun Deno Node.js
hasOwnProperty
1
12
1
5
3
18
4
10.1
1
1.0
1
1
1.0.0
1.0
0.10.0

См. также

  • Object.hasOwn()
  • Перечисляемость и владение свойствами
  • Object.getOwnPropertyNames()
  • for...in
  • in
  • Наследование и цепочка прототипов

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API