Die new.target Eigenschaft lässt erkennen, ob eine Funktion oder ein Konstruktor mit dem new Operator aufgerufen wurde. In Konstruktoren und Funktionen die mit dem new Operator instanziiert wurde, gibt new.target eine Referenz zu dem Konstruktor oder der Funktion zurück. In normalen Funktionsaufrufen hat new.target den Wert undefined.
The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
Syntax
new.target
Beschreibung
Die new.target Syntax besteht aus dem Schlüsselwort "new", einem Punkt und dem Eigenschaftnamen "target". Normalerweise steht "new." für einen Eigenschaftszugriff, jedoch ist "new." kein Objekt. In Konstruktoraufrufen referenziert new.target auf den Konstruktor, der mit new aufgerufen wurde und somit bekommt "new." einen virtuellen Kontext.
Die new.target Eigenschaft ist eine Metaeigenschaft, die in allen Funktionen erreichbar ist. In Pfeilfunktionen referenziert new.target zum new.target der umschließenden Funktion.
Beispiele
new.target in Funktionsaufrufen
In normalen Funktionsaufrufen (im Gegensatz zu Konstruktorfunktionsaufrufen) ist new.target undefined. Damit lässt sich herausfinden, ob eine Funktion mit new als Konstruktor aufgerufen wurde.
function Foo() {
if (!new.target) throw 'Foo() must be called with new';
console.log('Foo instantiated with new');
}
Foo(); // throws "Foo() must be called with new"
new Foo(); // logs "Foo instantiated with new"
new.target in Konstruktoren
In Klassenkonstruktoren referenziert new.target den Konstruktor, der direkt mit new aufgerufen wurde. Das ist auch der Fall, wenn der Konstruktor in einer Elternklasse ist und vom Kinderkonstruktor weiter delegiert wurde.
class A {
constructor() {
console.log(new.target.name);
}
}
class B extends A { constructor() { super(); } }
var a = new A(); // logs "A"
var b = new B(); // logs "B"
class C { constructor() { console.log(new.target); } }
class D extends C { constructor() { super(); } }
var c = new C(); // logs class C{constructor(){console.log(new.target);}}
var d = new D(); // logs class D extends C{constructor(){super();}}
Aus dem obigen Beispiel der Klasse C und D scheint es also, dass new.target auf die Klassendefinition der Klasse zeigt, die initialisiert wird. Wenn beispielsweise D mit new initialisiert wurde, wurde die Klassendefinition von D ausgegeben und in ähnlicher Weise wurde im Fall von c die Klasse C ausgegeben.
Spezifikationen
| Spezifikation | Status | Kommentar |
|---|---|---|
| ECMAScript 2015 (6th Edition, ECMA-262) Die Definition von 'Built-in Function Objects' in dieser Spezifikation. |
Standard | Initiale Definition. |
| ECMAScript Latest Draft (ECMA-262) Die Definition von 'Built-in Function Objects' in dieser Spezifikation. |
Entwurf |
Browserkompatibilität
| Desktop | Mobile | Server | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
new.target | Chrome Vollständige Unterstützung 46 | Edge Vollständige Unterstützung 13 | Firefox Vollständige Unterstützung 41 | IE Keine Unterstützung Nein | Opera Vollständige Unterstützung Ja | Safari Vollständige Unterstützung Ja | WebView Android Vollständige Unterstützung 46 | Chrome Android Vollständige Unterstützung 46 | Firefox Android Vollständige Unterstützung 41 | Opera Android Vollständige Unterstützung Ja | Safari iOS Vollständige Unterstützung Ja | Samsung Internet Android Vollständige Unterstützung 5.0 | nodejs Vollständige Unterstützung 5.0.0 |
Legende
- Vollständige Unterstützung
- Vollständige Unterstützung
- Keine Unterstützung
- Keine Unterstützung