Spec-Zone.ru › JavaScript

ReferenceError: super() вызван дважды в конструкторе производного класса

Исключение JavaScript "super() called twice in derived class constructor" возникает, когда super() вызывается во второй раз для данного конструктора производного класса.

Сообщение

ReferenceError: Super constructor may only be called once (V8-based)
ReferenceError: super() called twice in derived class constructor (Firefox)
ReferenceError: 'super()' can't be called more than once in a constructor. (Safari)

Тип ошибки

ReferenceError

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

Вызов super() может быть вызван не более одного раза для каждого вызова new конструктора производного класса. Это связано с тем, что super() отвечает за инициализацию родительского класса, и вызов его более одного раза приведёт к тому, что конструктор родителя будет вызван несколько раз.

Лучший способ предотвратить это — убедиться, что super() размещён вне любой структуры потока управления. В противном случае убедитесь, что все пути кода в конструкторе приводят только к одному вызову super().

Вызов super() может быть "сохранён" в стрелочной функции, вложенной в конструктор. Затем, когда вы вызываете стрелочную функцию, вы также вызываете super(), и применяется то же правило: стрелочная функция может быть вызвана не более одного раза.

Примеры

Некорректные случаи

class Base {}

class Derived extends Base {
  constructor() {
    super();
    super();
  }
}

Иногда ошибка может быть более тонкой.

class Base {
  constructor(flavor) {
    // Do something with the flavor
  }
}

class Derived extends Base {
  constructor(flavors) {
    if (flavors.includes("chocolate")) {
      super("chocolate");
    }
    if (flavors.includes("vanilla")) {
      super("vanilla");
    }
  }
}

Изначально flavors может никогда не включать одновременно "chocolate" и "vanilla", но если это произойдёт, конструктор вызовет super() дважды. Вам нужно переосмыслить, как должен быть структурирован ваш класс, чтобы избежать этой проблемы.

Корректные случаи

class Base {}

class Derived extends Base {
  constructor() {
    super();
    // More initialization logic
  }
}

См. также

  • Классы
  • 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_called_twice

Spec-Zone.ru

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