super

Das super Schlüsselwort wird verwendet, um Funktionen in einem Vaterobjekt auszuführen.
 
Die 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.

Siehe auch

Schlagwörter des Dokuments und Mitwirkende

 Mitwirkende an dieser Seite: schlagi123, Skycro
 Zuletzt aktualisiert von: schlagi123,