Что делает метод hasOwnProperty()?

👨‍💻 Frontend Developer 🟠 Может встретиться 🎚️ Легкий
#JavaScript #Объекты #База JS

Краткий ответ

Метод hasOwnProperty() проверяет, есть ли указанное свойство у объекта как его собственное свойство, не заглядывая в прототип. Возвращает true, если свойство найдено, и false, если нет или оно унаследовано.

const obj = { name: 'Александр' };
console.log(obj.hasOwnProperty('name')); // true
console.log(obj.hasOwnProperty('toString')); // false

Полный ответ

Метод hasOwnProperty() — это способ проверить, принадлежит ли свойство самому объекту, а не пришло по наследству от прототипа.

Как работает hasOwnProperty()

Проверяет только собственные свойства объекта:

const obj = { name: 'Иван' };
console.log(obj.hasOwnProperty('name')); // true
console.log(obj.hasOwnProperty('toString')); // false

Что проверяет hasOwnProperty()

Только собственные свойства

const obj = {};
// У всех объектов есть toString, но он унаследован
console.log(obj.hasOwnProperty('toString')); // false

Простые примеры

Проверка своих свойств

const user = { name: 'Иван' };
 
if (user.hasOwnProperty('name')) {
  console.log('Своё свойство'); // Сработает
}
 
if (user.hasOwnProperty('toString')) {
  console.log('Своё свойство'); // Не сработает
}

Работа с наследованием

const parent = { inherited: 'value' };
const child = Object.create(parent);
child.own = 'value';
 
console.log(child.hasOwnProperty('own')); // true — своё
console.log(child.hasOwnProperty('inherited')); // false — унаследовано

Важные особенности

1. Не видит унаследованное

const arr = [1, 2, 3];
// Методы массива унаследованы
console.log(arr.hasOwnProperty('push')); // false
console.log(arr.hasOwnProperty('length')); // true — своё свойство

2. Защита от прототипного наследования

const obj = { name: 'Иван' };
 
// Безопасный перебор только своих свойств
for (let key in obj) {
  if (obj.hasOwnProperty(key)) {
    console.log(key, obj[key]); // Только свои свойства
  }
}

Когда использовать hasOwnProperty()

Фильтрация унаследованных свойств

const obj = { name: 'Иван' };
 
// ❌ Видим все свойства, включая унаследованные
for (let key in obj) {
  console.log(key); // name, toString, hasOwnProperty...
}
 
// ✅ Только свои свойства
for (let key in obj) {
  if (obj.hasOwnProperty(key)) {
    console.log(key); // только name
  }
}

Проверка чистых данных

const data = { a: 1, b: 2 };
 
// Убедиться, что свойства свои, не унаследованные
Object.keys(data).forEach(key => {
  if (data.hasOwnProperty(key)) {
    console.log(key, data[key]);
  }
});

Частые ошибки

1. Путаница с оператором in

const obj = { name: 'Иван' };
 
// ❌ Видит всё, включая унаследованное
console.log('toString' in obj); // true
 
// ✅ Видит только свои свойства
console.log(obj.hasOwnProperty('toString')); // false

2. Забыть проверку при переборе

const obj = { name: 'Иван' };
 
// ❌ Ошибка — не проверяем наследование
for (let key in obj) {
  console.log(obj[key]); // Выведет и name, и toString, и другие методы
}
 
// ✅ Правильно — проверяем наследование
for (let key in obj) {
  if (obj.hasOwnProperty(key)) {
    console.log(obj[key]); // Только name
  }
}

Простые правила

  1. hasOwnProperty — проверяет только свои свойства
  2. Не видит унаследованное — игнорирует прототипную цепочку
  3. true/false — возвращает булево значение
  4. Безопасный перебор — используй с for…in
  5. Чистые данные — когда нужно только своё

Метод hasOwnProperty() важен для работы с объектами, когда нужно отличать свои свойства от унаследованных.


Хотите больше статей для подготовки к собеседованиям? Подписывайтесь на EasyAdvice, добавляйте сайт в закладки и совершенствуйтесь каждый день 💪