Что выведет код 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 ошибок.