Heim  >  Artikel  >  Web-Frontend  >  Wie erleichtert die Metaeigenschaft „new.target' die ES6-Klassenvererbung?

Wie erleichtert die Metaeigenschaft „new.target' die ES6-Klassenvererbung?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-06 04:37:02579Durchsuche

How does the

Grundlegendes zu „new.target“

Die ECMAScript 2015-Spezifikation führt eine Metaeigenschaft namens „new.target“ ein, die darin verwendet wird Nicht-Pfeil-Funktionen, um festzustellen, ob die Funktion als Konstruktor aufgerufen wurde.

Definition und Zweck

"new.target" bezieht sich auf die erste Metaeigenschaft und ist formal definiert in §12.3.8 der Spezifikation. Sein einziger Zweck besteht darin, den aktuellen Wert des internen Werts „[[NewTarget]]“ einer Funktion abzurufen. Dieser Wert wird beim Aufruf der Funktion festgelegt, ähnlich der „this“-Bindung.

Gemäß §8.1.1.3 Function Environment Records wird der „[[NewTarget]]“-Wert auf den „[[ Construct]]“ newTarget-Parameter, wenn die Funktion als Konstruktor aufgerufen wird. Andernfalls bleibt sein Wert undefiniert.

Wichtigkeit für ES6-Klassen

„new.target“ spielt eine entscheidende Rolle bei der Implementierung von ES6-Klassen und ermöglicht ihnen, von ihnen zu erben eingebaute Objekte. Beim Aufruf eines Klassenkonstruktors mit „new“ ist der „this“-Wert noch nicht initialisiert. Wenn jedoch die super()-Methode aufgerufen wird, wird das Objekt erstellt und so eingestellt, dass es vom „.prototype“ des „newTarget“-Konstruktors erbt.

Beispiel

Das folgende Beispiel zeigt, wie „new.target“ bei der Klassenvererbung verwendet wird:

class Parent {
  constructor() {
    // Implicit from 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 uninitialized (and would throw if accessed)
    // Implicit from new call: new.target = Child
    super() // this = Reflect.construct(Parent, [], new.target)
    console.log(this)
  }
}

new Child

In diesem Beispiel:

  • Der übergeordnete Konstruktor verwendet „new.target“ für den Zugriff der untergeordnete Konstruktor.
  • Der untergeordnete Konstruktor verwendet „new.target“, um zu bestimmen, dass er mit „new“ aufgerufen wurde, obwohl der super()-Aufruf erfolgt, bevor der „this“-Wert initialisiert wird.
  • Dadurch kann der Child-Konstruktor korrekt vom Parent-Prototyp erben.

Das obige ist der detaillierte Inhalt vonWie erleichtert die Metaeigenschaft „new.target' die ES6-Klassenvererbung?. 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