> Что делает метод 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) для надёжности, особенно в библиотечном коде.
Пример кода
JAVASCRIPTconst parent = { inherited: true };const child = Object.create(parent);child.own = 'my property';console.log(child.hasOwnProperty('own')); // trueconsole.log(child.hasOwnProperty('inherited')); // falseconsole.log('inherited' in child); // true// Безопасный вызов через прототипconst obj = Object.create(null);obj.own = 'test';console.log(Object.prototype.hasOwnProperty.call(obj, 'own')); // trueconsole.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или проверка индекса
> Похожие задачи по frontend
Как реализовать рекурсивную чистую функцию для инверсии значений в объекте в JavaScript
Что возвращает typeof для массива в JavaScript
Как реализовать добавление рандомного товара в корзину и удаление его из ассортимента по клику?
Какие способы выполнения HTTP-запросов в браузере на JavaScript?
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью