Heim >Web-Frontend >js-Tutorial >Wie hilft uns „new.target', die Vererbung in ES6-Klassen zu verstehen?
Der Begriff „new.target“ kommt in der ECMAScript 2015-Spezifikation (14.2.3 und 14.2.16) nur selten vor. Fragen zu seinem Zweck aufwerfen. Interessanterweise lautet der vollständige Name NewTarget, der in §12.3.8 zu finden ist.
NewTarget ist eine Metaeigenschaft, die den aktuellen Wert von [[NewTarget]] innerhalb der aktuellen abruft Nicht-Pfeil-Funktionsumgebung. Wenn eine Funktion aufgerufen wird, wird ein [[NewTarget]]-Wert zugewiesen, ähnlich der Bindung this.
Bisher konnte nicht erkannt werden, ob eine Funktion als Konstruktor aufgerufen wurde ausdrücklich unterstützt. NewTarget löst dieses Problem jedoch, indem es offenlegt, ob die interne Methode [[Construct]] den Umgebungsdatensatz erstellt hat. Gemäß §8.1.1.3 enthält [[NewTarget]] den Wert des Parameters [[Construct]] newTarget, wenn der Umgebungsdatensatz von [[Construct]] erstellt wurde. Andernfalls bleibt es undefiniert.
Während syntaktischer Zucker bieten ES6-Klassen echte Vererbung. Hier spielt NewTarget eine entscheidende Rolle. Beim Aufrufen eines Klassenkonstruktors mit neuem X ist dieser Wert zunächst nicht festgelegt. Der super()-Aufruf innerhalb des Konstruktors erstellt das Objekt, erbt jedoch vom .prototype des ursprünglich aufgerufenen Konstruktors.
NewTarget erfasst den äußersten Konstruktor, der den neuen Aufruf erhalten hat. Es ist nicht der aktuell ausgeführte Konstruktor. Dieser Wert wird an die OrdinaryCreateFromConstructor-Prozedur übergeben, um sicherzustellen, dass die Instanz korrekt vom gewünschten Prototyp erbt.
Betrachten Sie zur Veranschaulichung die folgenden Klassen:
<code class="javascript">class Parent { constructor() { // implicit (from the `super` call) // new.target = Child; // implicit (because `Parent` doesn't extend anything): // this = Object.create(new.target.prototype); console.log(new.target) // Child! } } class Child extends Parent { constructor() { // `this` is uninitialised (and would throw if accessed) // implicit (from the `new` call): // new.target = Child super(); // this = Reflect.construct(Parent, [], new.target); console.log(this); } } new Child;</code>
In diesem Beispiel ermöglicht NewTarget der Parent-Klasse zu erkennen, dass sie als Konstruktor durch die Child-Klasse aufgerufen wurde. Die Child-Klasse nutzt diese Informationen dann während ihres super()-Aufrufs, um die Vererbung ordnungsgemäß einzurichten.
Das obige ist der detaillierte Inhalt vonWie hilft uns „new.target', die Vererbung in ES6-Klassen zu verstehen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!