Heim >Web-Frontend >js-Tutorial >Wie hilft uns „new.target', die Vererbung in ES6-Klassen zu verstehen?

Wie hilft uns „new.target', die Vererbung in ES6-Klassen zu verstehen?

DDD
DDDOriginal
2024-10-29 00:45:30871Durchsuche

How does `new.target` help us understand inheritance in ES6 classes?

Verstehen von „new.target“ in JavaScript

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.

Metadaten und NewTarget

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.

Konstruktoraufrufe identifizieren

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.

Vererbung in ES6-Klassen

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.

Beispiel

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn