> Что делает метод hasOwnProperty в JavaScript (JavaScript)

Уровень: middle · Роль: frontend · Категория: Технические вопросы

Компании: EvApps

Стек: JavaScript

> Пример ответа

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

hasOwnProperty - это метод, который проверяет, принадлежит ли свойство непосредственно объекту, а не его цепочке прототипов. Возвращает true, если свойство является собственным (own property), и false, если оно унаследовано или отсутствует. Это ключевое отличие от оператора in, который проверяет всю цепочку прототипов.

Подробное объяснение

Метод hasOwnProperty определён на Object.prototype и доступен всем объектам через наследование. Он принимает один аргумент - имя свойства в виде строки (или Symbol) - и возвращает true, если свойство существует непосредственно на объекте, не затрагивая прототипную цепочку.

Это критически важно при итерации по объектам с for...in, который перечисляет как собственные, так и унаследованные перечисляемые свойства. Без hasOwnProperty можно случайно обработать свойства из прототипа, что часто приводит к багам.

Современная альтернатива - статический метод Object.hasOwn(), добавленный в ES2022. Он решает проблему, когда объект может переопределить hasOwnProperty или быть создан с Object.create(null) (без прототипа).

На практике

hasOwnProperty используется в трёх основных сценариях:

  • фильтрация собственных свойств при обходе объекта
  • безопасная проверка наличия ключа без риска получить унаследованное свойство
  • защита от коллизий, когда объект может содержать свойство с именем hasOwnProperty

Рекомендуется вызывать метод через Object.prototype.hasOwnProperty.call(obj, prop) или использовать Object.hasOwn(obj, prop) для надёжности, особенно в библиотечном коде.

Пример кода

JAVASCRIPT
const parent = { inherited: true };
const child = Object.create(parent);
child.own = 'my property';
console.log(child.hasOwnProperty('own')); // true
console.log(child.hasOwnProperty('inherited')); // false
console.log('inherited' in child); // true
// Безопасный вызов через прототип
const obj = Object.create(null);
obj.own = 'test';
console.log(Object.prototype.hasOwnProperty.call(obj, 'own')); // true
console.log(Object.hasOwn(obj, 'own')); // true (ES2022)

Как отвечать на собеседовании

Начни с чёткого определения: метод проверяет собственные свойства, в отличие от in. Приведи пример с наследованием, чтобы показать разницу. Упомяни проблему с Object.create(null) и переопределением метода. Если знаешь про Object.hasOwn() - добавь как современное решение. Не углубляйся в реализацию движка, достаточно понимания цепочки прототипов.

Что проверяет интервьюер

  • Понимание разницы между собственными и унаследованными свойствами
  • Знание цепочки прототипов и работы for...in
  • Осведомлённость о потенциальных проблемах (переопределение, объекты без прототипа)
  • Знание современных альтернатив (Object.hasOwn)
  • Умение применять метод на практике, а не просто дать определение

Типичные ошибки

  • Путают hasOwnProperty с оператором in - не понимают разницу в проверке прототипов
  • Используют obj.hasOwnProperty(key) без проверки, что hasOwnProperty не переопределён
  • Забывают, что метод не работает на объектах, созданных через Object.create(null)
  • Думают, что hasOwnProperty проверяет только перечисляемые свойства - на самом деле он проверяет любые собственные, включая неперечисляемые
  • Используют hasOwnProperty для массивов, хотя для них лучше Array.isArray или проверка индекса

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью