ホームページ >ウェブフロントエンド >jsチュートリアル >「new.target」はどのように継承を有効にし、ES6 クラスのコンストラクター呼び出しを区別しますか?

「new.target」はどのように継承を有効にし、ES6 クラスのコンストラクター呼び出しを区別しますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-03 11:53:29512ブラウズ

How does `new.target` Enable Inheritance and Differentiate Constructor Calls in ES6 Classes?

「new.target」について

定義と場所

ECMAScript 2015 仕様では 3 回しか言及されていませんが、「new.target」は§12.3.8.

目的と使用法

"NewTarget" で定義されたメタ プロパティは、現在の関数環境の [[NewTarget]] 内部プロパティの値を取得します。この値は、関数がコンストラクターとして呼び出されるときに設定されます。

関数が new を使用して呼び出された場合、new.target は新しいインスタンスの作成に使用されるコンストラクター関数を参照します。これにより、開発者はコンストラクターと通常の関数呼び出しを区別できるようになります。

ES6 クラスの重要性

「NewTarget」は ES6 クラスで重要な役割を果たします。クラス コンストラクターが new で呼び出されると、最初は初期化されていない this が返されます。ただし、super() は、引数として new.target を渡しながら親コンストラクターを呼び出すことによってこれを初期化します。

このメカニズムにより、クラスは Array や Map などの組み込みオブジェクトから継承できます。 new.target を親コンストラクターに渡すことで、正しいプロトタイプ チェーンが確立され、新しいインスタンスが適切なプロトタイプ オブジェクトから確実に継承されます。

次のクラス構造を考えてみましょう。

class Parent {
  constructor() {
    // new.target = Child (from super() call)
    console.log(new.target);
  }
}

class Child extends Parent {
  constructor() {
    // new.target = Child (from new call)
    super();
    console.log(this);
  }
}

new Child;

この例では、new.target は次のとおりです。

  • 親コンストラクター内の子 (super() 呼び出しから呼び出されます)
  • 子コンストラクター内の子(new で呼び出されます)

出力は次のようになります:

Child
{ __proto__: Child.prototype }

これは、new.target を使用してコンストラクターと通常の関数呼び出しを区別する方法と、 ES6 クラスの継承を管理します。

以上が「new.target」はどのように継承を有効にし、ES6 クラスのコンストラクター呼び出しを区別しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。