new.target プロパティは、関数やコンストラクタが new 演算子を使用して呼び出されたかどうかを検出できるようにします。コンストラクタや関数内で、new 演算子でインスタンス生成すると、new.target はコンストラクタや関数への参照を返します。通常の関数呼び出しの場合、new.target は undefined です。
構文
new.target
概要
new.target 構文は、"new" キーワードとドット、プロパティ名 "target" で構成されています。通常、"new." はプロパティアクセスへのコンテキストとして機能しますが、"new." は本当はオブジェクトではありません。しかし、コンストラクタの呼び出しで、new.target は new で実行されたコンストラクタを参照し、"new." は仮想コンテキストになります。
new.target プロパティは、すべての関数で使用できるメタプロパティです。アロー関数 では、new.target は周囲の関数の new.target を参照します。
例
関数呼び出しにおいての new.target の使用
通常の関数呼び出しでは(コンストラクタ関数の呼び出しとは反対に)、new.target は undefined です。 これは、関数がコンストラクタとして 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.target は new で直接実行されたコンストラクタを参照します。これは、コンストラクタは親クラスにあり、子コンストラクタからデリゲートされた場合も同様です。
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 |