ホームページ > ウェブフロントエンド > jsチュートリアル > 「new.target」は ES6 クラスの継承を理解するのにどのように役立ちますか?

「new.target」は ES6 クラスの継承を理解するのにどのように役立ちますか?

DDD
リリース: 2024-10-29 00:45:30
オリジナル
870 人が閲覧しました

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

JavaScript の「new.target」について

「new.target」という用語は、ECMAScript 2015 仕様 (14.2.3 および 14.2.16) にはあまり登場しません。その目的について疑問が生じています。興味深いことに、その完全名は NewTarget であり、§12.3.8 にあります。

メタデータと NewTarget

NewTarget は、現在のプロパティ内の [[NewTarget]] の現在の値を取得するメタ プロパティです。アロー関数以外の環境。関数が呼び出されると、このバインディングと同様に、[[NewTarget]] 値が割り当てられます。

コンストラクター呼び出しの識別

以前は、関数がコンストラクターとして呼び出されたかどうかを検出できませんでした。明示的にサポートされています。ただし、NewTarget は、[[Construct]] 内部メソッドが環境レコードを作成したかどうかを明らかにすることでこの問題を解決します。 §8.1.1.3 によれば、環境レコードが [[Construct]] によって作成された場合、[[NewTarget]] は [[Construct]] newTarget パラメータの値を保持します。それ以外の場合は未定義のままです。

ES6 クラスの継承

糖衣構文ではありますが、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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート