new.target
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 (ECMA-262) Die Definition von 'Built-in Function Objects' in dieser Spezifikation. |
Lebender Standard |
Browserkompatibilität
BCD tables only load in the browser