new.target
new.target
は擬似プロパティで、関数やコンストラクターが new 演算子を使用して呼び出されたかどうかを検出することができます。 new 演算子を使用して呼び出されたコンストラクターや関数の中では、 new.target
はコンストラクターや関数への参照を返します。通常の関数呼び出しの場合、 new.target
は undefined
になります。
試してみましょう
構文
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')
}
new Foo() // "Foo instantiated with new" を出力
Foo() // "Foo() must be called with new" 例外が発生
コンストラクターにおける new.target
クラスのコンストラクターでは、new.target
は new
で直接実行されたコンストラクターを参照します。これは、コンストラクターが親クラスにあり、子コンストラクターから委任された場合も同様です。
class A {
constructor() {
console.log(new.target.name)
}
}
class B extends A { constructor() { super() } }
let a = new A() // logs "A"
let b = new B() // logs "B"
class C { constructor() { console.log(new.target) } }
class D extends C { constructor() { super() } }
let c = new C() // logs class C{constructor(){console.log(new.target);}}
let d = new D() // logs class D extends C{constructor(){super();}}
上記の C
および D
クラスの例から、 new.target
は初期化されたクラスのクラス定義を指しているように見えます。たとえば、d
を new D()
で初期化した場合は、 D
のクラス定義が出力され、同様に c
の場合は C
のクラスが出力されます。
仕様書
Specification |
---|
ECMAScript Language Specification # sec-built-in-function-objects |
ブラウザーの互換性
BCD tables only load in the browser