「new.target」という用語は、ECMAScript 2015 仕様 (14.2.3 および 14.2.16) にはあまり登場しません。その目的について疑問が生じています。興味深いことに、その完全名は NewTarget であり、§12.3.8 にあります。
NewTarget は、現在のプロパティ内の [[NewTarget]] の現在の値を取得するメタ プロパティです。アロー関数以外の環境。関数が呼び出されると、このバインディングと同様に、[[NewTarget]] 値が割り当てられます。
以前は、関数がコンストラクターとして呼び出されたかどうかを検出できませんでした。明示的にサポートされています。ただし、NewTarget は、[[Construct]] 内部メソッドが環境レコードを作成したかどうかを明らかにすることでこの問題を解決します。 §8.1.1.3 によれば、環境レコードが [[Construct]] によって作成された場合、[[NewTarget]] は [[Construct]] newTarget パラメータの値を保持します。それ以外の場合は未定義のままです。
糖衣構文ではありますが、ES6 クラスは真の継承を提供します。ここで NewTarget が重要な役割を果たします。 new X を使用してクラス コンストラクターを呼び出す場合、this 値は最初は設定されていません。コンストラクター内の super() 呼び出しはオブジェクトを作成しますが、最初に呼び出されたコンストラクターの .prototype を継承します。
NewTarget は、新しい呼び出しを受け取った最も外側のコンストラクターをキャプチャします。現在実行中のコンストラクターではありません。この値は OrdinaryCreateFromConstructor プロシージャに渡されるもので、インスタンスが目的のプロトタイプから正しく継承されるようにします。
説明のために、次のクラスを考えてみます。
<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>
この例では、NewTarget により、親クラスが子クラスを通じてコンストラクターとして呼び出されたことを認識できるようになります。次に、Child クラスは super() 呼び出し中にこの情報を利用して、継承を適切に確立します。
以上が「new.target」は ES6 クラスの継承を理解するのにどのように役立ちますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。