Выбор ответа 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 добавлен в прототип обычным…
Варианты ответа
xx,move,legacyx,legacyправильный ответx,move
Разбор
for...in обходит перечисляемые свойства объекта и всей цепочки прототипов. x собственное перечисляемое поле. move объявлен в теле класса, а методы классов создаются неперечисляемыми, поэтому его нет. legacy добавлен в прототип обычным присваиванием, а такое свойство перечисляемое, и for...in его покажет. Отсюда старое правило: внутри for...in проверять Object.hasOwn, а лучше обходить Object.keys.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.