Что выведет код Senior Прототипы и классы обновлено
Поле наследника во время конструктора родителя
Вопрос
Что выведет код? По строке на каждый вывод.
class Base {
constructor() {
console.log(this.describe());
}
describe() { return 'base'; }
}
class Child extends Base {
label = 'child';
describe() { return 'label=' + this.label; }
}
const c = new Child();
console.log(c.describe());
Попробуйте сами
Напишите, что выведет код: каждый вывод с новой строки.
Показать ответ и разбор
Коротко
Код выведет: label=undefined, label=child. Конструктор Base вызывает this.describe(), а this это уже экземпляр Child, поэтому вызывается переопределённый метод.
Что выведет
label=undefined
label=child
Разбор
Конструктор Base вызывает this.describe(), а this это уже экземпляр Child, поэтому вызывается переопределённый метод. Но поля наследника инициализируются только после возврата из super(), а неявный конструктор Child как раз внутри super(). В этот момент label ещё нет: label=undefined. После создания объекта поле на месте: label=child.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.