> Если объект является экземпляром класса и методы лежат в прототипе, где их увидим: в 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.

Пример кода

JAVASCRIPT
class 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 включает методы из прототипа (это не так).

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

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