Spec-Zone.ru › JavaScript

ReferenceError: необходимо вызвать конструктор super перед использованием 'this' в конструкторе производного класса

Исключение JavaScript "must call super constructor before using 'this' in derived class constructor" возникает, когда super() не вызывается для данного конструктора производного класса, и производный конструктор пытается получить доступ к значению this, или производный конструктор уже вернул значение, и это возвращаемое значение не является объектом.

Сообщение

ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor (V8-based)
ReferenceError: must call super constructor before using 'this' in derived class constructor (Firefox)
ReferenceError: 'super()' must be called in derived constructor before accessing |this| or returning non-object. (Safari)

Тип ошибки

ReferenceError

Что пошло не так?

Вызов super() может быть вызван не более одного раза для каждого вызова new конструктора производного класса. Часто вам нужно вызвать его ровно один раз, потому что если вы этого не сделаете, родительский конструктор не сможет инициализировать значение this, поэтому вы не сможете получить доступ к this в производном конструкторе, и this не будет считаться допустимым сконструированным объектом (и будет выдана ошибка, если производный конструктор завершится в этом состоянии). Выход состоит в том, чтобы вернуть объект из конструктора производного класса, и в этом случае возвращенный объект будет использоваться в качестве сконструированного объекта вместо this, что позволит вам не вызывать super(). Однако это делается редко.

Примеры

Недопустимые случаи

class Base {
  constructor() {
    this.x = 1;
  }
}

class Derived extends Base {
  constructor() {
    console.log(this.x);
    // The Base constructor is not called yet, so this.x is undefined
    // ReferenceError: must call super constructor before using 'this' in derived class constructor
  }
}

Допустимые случаи

class Base {
  constructor() {
    this.x = 1;
  }
}

class Derived extends Base {
  constructor() {
    super();
    console.log(this.x); // 1
  }
}

Смотрите также

  • Классы
  • super

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Super_not_called

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API