super.prop
und super[expr]
Ausdrücke sind in allen Methodendefinitionen von Klassen und Objekt Literalen verfügbar.Syntax
super([arguments]); // calls the parent constructor. super.functionOnParent([arguments]);
Beschreibung
Wenn ein Konstruktor verwendet wird, muss das super
Schlüsselwort verwendet werden, bevor das this
Schlüsselwort verwendet werden kann. Mit dem super
Schlüsselwort kann man auch Funktionen im Vaterobjekt ausführen.
Beispiel
super
in Klassen verwenden
Der Codeabschnitt ist vom classes Beispiel (Live Demo).
class Polygon { constructor(height, width) { this.name = 'Polygon'; this.height = height; this.width = width; } sayName() { console.log('Hi, I am a ', this.name + '.'); } } class Square extends Polygon { constructor(length) { this.height; // ReferenceError, super needs to be called first! // Here, it calls the parent class' constructor with lengths // provided for the Polygon's width and height super(length, length); // Note: In derived classes, super() must be called before you // can use 'this'. Leaving this out will cause a reference error. this.name = 'Square'; } get area() { return this.height * this.width; } set area(value) { this.area = value; } }
super
Aufruf in statischen Methoden
super
kann auch in statischen Methoden verwendet werden.
class Human { constructor() {} static ping() { return 'ping'; } } class Computer extends Human { constructor() {} static pingpong() { return super.ping() + ' pong'; } } Computer.pingpong(); // 'ping pong'
Das Löschen von super
erzeugt einen Fehler
Man kann den delete
Operator in Verbindung mit super.prop
oder super[expr]
einsetzen, um eine Eigenschaft im Vaterobjekt zu löschen. Dieses wird einen ReferenceError
erzeugen.
class Base { constructor() {} foo() {} } class Derived extends Base { constructor() {} delete() { delete super.foo; } } new Derived().delete(); // ReferenceError: invalid delete involving 'super'.
super.prop
kann keine schreibgeschützten Eigenschaften überschreiben
Wenn eine schreibgeschützte Eigenschaft mit z.B. Object.defineProperty
" erzeugt wird, kann der Wert nicht mit super
überschrieben werden.
class X { constructor() { Object.defineProperty(this, "prop", { configurable: true, writable: false, value: 1 }); } f() { super.prop = 2; } } var x = new X(); x.f(); console.log(x.prop); // 1
Nutzen von super.prop
in Objektliteralen
super kann auch in der object initializer / literal Notation verwendet werden. In diesem Beispiel definieren zwei Objekte eine Methode. Im zweiten Beispiel wird mit super
die Funktion im ersten Objekt aufgerufen. Das funktioniert mit Hilfe von Object.setPrototypeOf()
. Damit ist es möglich den Prototypen von obj2
auf obj1
zu setzen, damit super method1
in obj1
findet.
var obj1 = { method1() { console.log("method 1"); } } var obj2 = { method2() { super.method1(); } } Object.setPrototypeOf(obj2, obj1); obj2.method2(); // logs "method 1"
Spezifikationen
Spezifikation | Status | Kommentar |
---|---|---|
ECMAScript 2015 (6th Edition, ECMA-262) Die Definition von 'super' in dieser Spezifikation. |
Standard | Initiale Definition |
ECMAScript 2017 Draft (ECMA-262) Die Definition von 'super' in dieser Spezifikation. |
Entwurf |
Browserkompatibilität
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | 42.0 | 45 (45) | ? | ? | ? |
Feature | Android | Android Webview | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile | Chrome for Android |
---|---|---|---|---|---|---|---|
Basic support | ? | 42.0 | 45.0 (45) | ? | ? | ? | 42.0 |
Geckospezifische Anmerkungen
super()
funktioniert in standard eingebauten Prototypen nicht wie erwartet.