首頁  >  文章  >  web前端  >  「new.target」元屬性如何促進 ES6 類別繼承?

「new.target」元屬性如何促進 ES6 類別繼承?

Patricia Arquette
Patricia Arquette原創
2024-11-06 04:37:02577瀏覽

How does the

理解「new.target」

ECMAScript 2015 規範引入了一個稱為「new.target」的元屬性,該屬性在非箭頭函數來決定函數是否以建構函式呼叫。

定義與目的

「new.target」指的是第一個元屬性,形式上是規範第 12.3.8 節定義。它的唯一目的是檢索函數的“[[NewTarget]]”內部值的當前值。該值在函數呼叫時設置,類似於“this”綁定。

根據§8.1.1.3函數環境記錄,「[[NewTarget]]」值設定為「[[ Construct]]" newTarget 參數(如果該函數作為建構子呼叫)。否則,它的值保持未定義狀態。

ES6 類別的重要性

「new.target」在 ES6 類別的實作中起著至關重要的作用,允許它們繼承內建物件。當使用“new”呼叫類別建構函數時,“this”值尚未初始化。然而,當呼叫 super() 方法時,物件被建立並設定為繼承自「newTarget」建構子的「.prototype」。

範例

以下範例示範如何在類別繼承中使用「new.target」:

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

在此範例中:

  • Parent 建構子使用「new.target」來存取Child 建構子。
  • Child 建構子使用「new.target」來決定它是透過「new」呼叫的,即使 super() 呼叫是在「this」值初始化之前進行的。
  • 這允許子建構子正確地繼承父原型。

以上是「new.target」元屬性如何促進 ES6 類別繼承?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn