Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten.Erfahre mehr über dieses Experiment.
ReferenceError: super() zweimal im Konstruktor der abgeleiteten Klasse aufgerufen
Die JavaScript-Ausnahme "super() zweimal im Konstruktor der abgeleiteten Klasse aufgerufen" tritt auf, wenn ein zweites Mal für einen gegebenen Konstruktor einer abgeleiteten Klasse aufgerufen wird.super()
In diesem Artikel
Meldung
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)
Fehlertyp
ReferenceErrorWas ging schief?
Der Aufruf vonsuper() kann höchstens einmal für jedennew-Aufruf eines Konstruktors einer abgeleiteten Klasse erfolgen. Dies liegt daran, dasssuper() für die Initialisierung der Elternklasse verantwortlich ist und ein mehrfacher Aufruf dazu führen würde, dass der Konstruktor der Elternklasse mehrmals aufgerufen wird.
Der beste Weg, dies zu verhindern, besteht darin, sicherzustellen, dasssuper() außerhalb jeder Kontrollstruktur platziert wird. Andernfalls sollten Sie sicherstellen, dass alle Codepfade im Konstruktor nur zu einemsuper()-Aufruf führen.
Dersuper()-Aufruf kann in einer verschachtelten Arrow-Funktion im Konstruktor "gespeichert" werden. Wenn Sie dann die Arrow-Funktion aufrufen, wird auchsuper() aufgerufen, und es gilt die gleiche Regel: Die Arrow-Funktion kann höchstens einmal aufgerufen werden.
Beispiele
>Ungültige Fälle
class Base {}class Derived extends Base { constructor() { super(); super(); }}Manchmal kann der Fehler subtiler sein.
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"); } }}Ursprünglich könntenflavors möglicherweise nie gleichzeitig "chocolate" und "vanilla" enthalten, aber falls dies jemals der Fall ist, wird der Konstruktorsuper() zweimal aufrufen. Sie müssen überdenken, wie Ihre Klasse strukturiert sein sollte, um dieses Problem zu vermeiden.
Gültige Fälle
class Base {}class Derived extends Base { constructor() { super(); // More initialization logic }}