Выбор ответа Middle Прототипы и классы обновлено

for...in по экземпляру класса

Вопрос

Что выведет код?

class Point {
  x = 1;
  move() {}
}
Point.prototype.legacy = function () {};
const keys = [];
for (const k in new Point()) keys.push(k);
console.log(keys.join(','));

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: x,legacy. for...in обходит перечисляемые свойства объекта и всей цепочки прототипов. x собственное перечисляемое поле. move объявлен в теле класса, а методы классов создаются неперечисляемыми, поэтому его нет. legacy добавлен в прототип обычным…

Варианты ответа

  1. x
  2. x,move,legacy
  3. x,legacyправильный ответ
  4. x,move

Разбор

for...in обходит перечисляемые свойства объекта и всей цепочки прототипов. x собственное перечисляемое поле. move объявлен в теле класса, а методы классов создаются неперечисляемыми, поэтому его нет. legacy добавлен в прототип обычным присваиванием, а такое свойство перечисляемое, и for...in его покажет. Отсюда старое правило: внутри for...in проверять Object.hasOwn, а лучше обходить Object.keys.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.