ReferenceError: 'super' Konstruktor muss vor der Verwendung von 'this' im Konstruktor der abgeleiteten Klasse aufgerufen werden
Die JavaScript-Ausnahme "must call super constructor before using 'this' in derived class constructor" tritt auf, wenn die super()
im Konstruktor einer abgeleiteten Klasse nicht aufgerufen wird und der abgeleitete Konstruktor versucht, auf den Wert von this
zuzugreifen, oder wenn der abgeleitete Konstruktor bereits einen Wert zurückgegeben hat, der kein Objekt ist.
Nachricht
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)
Fehlertyp
Was ist schiefgelaufen?
Der super()
-Aufruf kann höchstens einmal pro new
-Aufruf eines abgeleiteten Klassenkonstruktors erfolgen. Oft müssen Sie ihn genau einmal aufrufen, denn wenn Sie ihn nicht aufrufen, kann der Elternkonstruktor den Wert von this
nicht initialisieren, so dass Sie nicht auf this
im abgeleiteten Konstruktor zugreifen können und this
nicht als gültiges konstruiertes Objekt betrachtet wird (und einen Fehler auslöst, wenn der abgeleitete Konstruktor in diesem Zustand abgeschlossen wird). Der Ausweg besteht darin, ein Objekt aus dem Konstruktor der abgeleiteten Klasse zurückzugeben; in diesem Fall wird das zurückgegebene Objekt als das konstruierte Objekt anstelle von this
verwendet, was es Ihnen erlaubt, super()
nicht aufzurufen. Dies wird jedoch selten gemacht.
Beispiele
Ungültige Fälle
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
}
}
Gültige Fälle
class Base {
constructor() {
this.x = 1;
}
}
class Derived extends Base {
constructor() {
super();
console.log(this.x); // 1
}
}