MDN’s new design is in Beta! A sneak peek: https://blog.mozilla.org/opendesign/mdns-new-design-beta/

new.target プロパティは、関数やコンストラクタが new 演算子を使用して呼び出されたかどうかを検出できるようにします。コンストラクタや関数内で、new 演算子でインスタンス生成すると、new.target はコンストラクタや関数への参照を返します。通常の関数呼び出しの場合、new.targetundefined です。

構文

new.target

概要

new.target 構文は、"new" キーワードとドット、プロパティ名 "target" で構成されています。通常、"new." はプロパティアクセスへのコンテキストとして機能しますが、"new." は本当はオブジェクトではありません。しかし、コンストラクタの呼び出しで、new.targetnew で実行されたコンストラクタを参照し、"new." は仮想コンテキストになります。

new.target プロパティは、すべての関数で使用できるメタプロパティです。アロー関数 では、new.target は周囲の関数の new.target を参照します。

関数呼び出しにおいての new.target の使用

通常の関数呼び出しでは(コンストラクタ関数の呼び出しとは反対に)、new.targetundefined です。 これは、関数がコンストラクタとして new で呼び出されたかを検出できます。

function Foo() {
  if (!new.target) throw "Foo() must be called with new";
  console.log("Foo instantiated with new");
}

Foo(); // throws "Foo() must be called with new"
new Foo(); // logs "Foo instantiated with new"

コンストラクタにおいての new.target

クラスコンストラクタで、new.targetnew で直接実行されたコンストラクタを参照します。これは、コンストラクタは親クラスにあり、子コンストラクタからデリゲートされた場合も同様です。

class A {
  constructor() {
    console.log(new.target.name);
  }
}

class B extends A { constructor() { super(); } }

var a = new A(); // logs "A"
var b = new B(); // logs "B"

仕様

仕様 ステータス コメント
ECMAScript 2015 (6th Edition, ECMA-262)
Built-in Function Objects の定義
標準 初期定義。
ECMAScript 2017 Draft (ECMA-262)
Built-in Function Objects の定義
ドラフト  

ブラウザ実装状況

機能 Chrome Firefox (Gecko) Internet Explorer Opera Safari
基本サポート 46.0 41 (41) 未サポート 未サポート 未サポート
機能 Android Android Webview Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile Chrome for Android
基本サポート 未サポート 46.0 41.0 (41) 未サポート 未サポート 未サポート 46.0

関連情報

ドキュメントのタグと貢献者

 このページの貢献者: YuichiNukiyama, shide55
 最終更新者: YuichiNukiyama,