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

this до вызова super

Вопрос

Что произойдёт при new Admin('Аня')?

class User {
  constructor(name) { this.name = name; }
}
class Admin extends User {
  constructor(name) {
    this.role = 'admin';
    super(name);
  }
}

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

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

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

Коротко

Правильный ответ: ReferenceError: к this нельзя обращаться до super(). В конструкторе наследника объект this создаёт родительский конструктор, поэтому до super() его ещё нет.

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

  1. Создастся объект с полями name и role, как обычно
  2. ReferenceError: к this нельзя обращаться до super()правильный ответ
  3. SyntaxError ещё при разборе класса, до создания объекта
  4. Создастся объект только с role, а name будет undefined

Разбор

В конструкторе наследника объект this создаёт родительский конструктор, поэтому до super() его ещё нет. Обращение к нему бросает ReferenceError во время выполнения. Синтаксически код корректен, парсер пропустит его. Объект не создастся вовсе, ни с одним полем. Правильно: сначала super(name), потом this.role = 'admin'.

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

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