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)
Тип ошибки
Что пошло не так?
Вызов 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
}
}
См. также
© 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