new.target

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 Latest Draft (ECMA-262)
Built-in Function Objects の定義
ドラフト  

ブラウザー実装状況

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeAndroid 版 FirefoxAndroid 版 OperaiOSのSafariSamsung InternetNode.js
new.targetChrome 完全対応 46Edge 完全対応 13Firefox 完全対応 41IE 未対応 なしOpera 完全対応 ありSafari 完全対応 ありWebView Android 完全対応 46Chrome Android 完全対応 46Firefox Android 完全対応 41Opera Android 完全対応 ありSafari iOS 完全対応 ありSamsung Internet Android 完全対応 5.0nodejs 完全対応 5.0.0

凡例

完全対応  
完全対応
未対応  
未対応

関連情報