> Если объект является экземпляром класса и методы лежат в прототипе, где их увидим: в for-in или Object.keys (JavaScript)
Уровень: middle · Роль: frontend · Категория: Технические вопросы
Компании: Kaspersky
Стек: JavaScript
> Пример ответа
Короткий ответ
Методы, лежащие в прототипе, будут видны в for...in, но не в Object.keys. for...in перебирает все перечисляемые свойства, включая унаследованные из цепочки прототипов. Object.keys возвращает только собственные перечисляемые свойства объекта, игнорируя прототип.
Подробное объяснение
for...in - это цикл, который проходит по всем перечисляемым свойствам объекта, включая те, что находятся в его цепочке прототипов. Если метод определён в прототипе класса и является перечисляемым (по умолчанию методы в прототипе - перечисляемые, если не задано enumerable: false), он будет виден в for...in.
Object.keys() возвращает массив только собственных (own) перечисляемых свойств объекта. Свойства из прототипа в него не попадают. Это ключевое различие: Object.keys игнорирует унаследованные свойства.
Пример: если у вас есть класс Animal с методом speak в прототипе и экземпляр dog, то for...in покажет и speak, и собственные свойства (например, name), а Object.keys(dog) - только name.
На практике
На практике for...in редко используется для перебора свойств объектов из-за включения унаследованных свойств. Обычно предпочитают Object.keys, Object.values, Object.entries или for...of с Object.keys, чтобы избежать неожиданностей. Если нужно перебрать все свойства, включая прототип, и при этом отфильтровать унаследованные, используют hasOwnProperty.
Пример кода
JAVASCRIPTclass Animal {constructor(name) {this.name = name;}speak() {console.log(`${this.name} makes a sound`);}}const dog = new Animal('Rex');console.log('for...in:');for (let key in dog) {console.log(key); // name, speak}console.log('Object.keys:');console.log(Object.keys(dog)); // ['name']
Как отвечать на собеседовании
Начни с прямого ответа: методы в прототипе видны в for...in, но не в Object.keys. Затем объясни причину: разница между собственными и унаследованными свойствами. Приведи краткий пример, чтобы проиллюстрировать. Упомяни, что for...in включает все перечисляемые свойства из цепочки прототипов, а Object.keys - только собственные. Добавь, что на практике Object.keys используется чаще из-за предсказуемости.
Что проверяет интервьюер
Интервьюер проверяет понимание цепочки прототипов в JavaScript, разницы между собственными и унаследованными свойствами, а также знание методов перебора свойств. Это тестирует базовое понимание объектной модели JS и умение работать с прототипами.
Типичные ошибки
- Утверждение, что
for...inне видит методы прототипа (это неверно, если они перечисляемые). - Путаница между
for...inиfor...of(первый перебирает ключи, второй - значения итераторов). - Забывание про
hasOwnPropertyпри использованииfor...inдля фильтрации унаследованных свойств. - Мысль, что
Object.keysвключает методы из прототипа (это не так).
> Похожие задачи по frontend
Что такое функция обратного вызова (callback) и когда она вызывается в JavaScript
Какие данные остаются после преобразования типов в JavaScript и когда оно происходит
Как реализовать перетаскивание модального окна мышкой на чистом JavaScript с использованием событий?
Как реализовать бесконечную ленту (infinite scroll) в веб-приложении
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью