new.target プロパティは、関数やコンストラクタが new 演算子を使用して呼び出されたかどうかを検出できるようにします。コンストラクタや関数内で、new 演算子でインスタンス生成すると、new.target はコンストラクタや関数への参照を返します。通常の関数呼び出しの場合、new.target は undefined です。
The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
構文
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 (ECMA-262) Built-in Function Objects の定義 |
現行の標準 |
ブラウザー実装状況
| デスクトップ | モバイル | サーバー | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
new.target | Chrome 完全対応 46 | Edge 完全対応 13 | Firefox 完全対応 41 | IE 未対応 なし | Opera 完全対応 33 | Safari 完全対応 11 | WebView Android 完全対応 46 | Chrome Android 完全対応 46 | Firefox Android 完全対応 41 | Opera Android 完全対応 33 | Safari iOS 完全対応 11 | Samsung Internet Android 完全対応 5.0 | nodejs 完全対応 5.0.0 |
凡例
- 完全対応
- 完全対応
- 未対応
- 未対応