概要: このチュートリアルでは、JavaScript の new.target
メタプロパティについて学びます。このメタプロパティは、関数またはコンストラクタが new
演算子を使用して呼び出されたかどうかを検出します。
JavaScript new.target 入門

ES6 では、new.target
という名前のメタプロパティが提供されており、関数またはコンストラクタが new
演算子を使用して呼び出されたかどうかを検出できます。
new.target
は、new
キーワード、ドット、および target
プロパティで構成されます。 new.target
はすべての関数で使用可能です。
ただし、アロー関数では、new.target
は周囲の関数に属するものです。
new.target
は、関数が関数として実行されているか、コンストラクタとして実行されているかを実行時に検査するのに非常に役立ちます。また、親クラス内から new
演算子を使用して呼び出された特定の派生クラスを特定するのにも便利です。
関数における JavaScript new.target
次の Person
コンストラクタ関数を見てみましょう。
function Person(name) {
this.name = name;
}
Code language: JavaScript (javascript)
Person
関数から新しいオブジェクトを作成するには、次のように new
演算子を使用します。
let john = new Person('John');
console.log(john.name); // john
Code language: JavaScript (javascript)
または、Person
を関数として呼び出すこともできます。
Person('Lily');
Code language: JavaScript (javascript)
JavaScript を Web ブラウザで実行する場合、this
は グローバルオブジェクト、つまり window
オブジェクトに設定されるため、name
プロパティは次のように window
オブジェクトに追加されます。
console.log(window.name); //Lily
Code language: JavaScript (javascript)
関数が new 演算子を使用して呼び出されたかどうかを検出できるようにするために、new.target
メタプロパティを使用します。
通常の関数呼び出しでは、new.target
は undefined
を返します。関数が new
演算子で呼び出された場合、new.target
はその関数への参照を返します。
Person
が関数として呼び出されるのを望まない場合は、次のように new.target
を使用できます。
function Person(name) {
if (!new.target) {
throw "must use new operator with Person";
}
this.name = name;
}
Code language: JavaScript (javascript)
これで、Person
を使用する唯一の方法は、new
演算子を使用してオブジェクトをインスタンス化することです。通常の関数のように呼び出そうとすると、エラーが発生します。
コンストラクタにおける JavaScript new.target
クラスコンストラクタでは、new.target
は new
演算子によって直接呼び出されたコンストラクタを参照します。コンストラクタが親クラスにあり、子クラスのコンストラクタから委譲された場合、true
になります。
class Person {
constructor(name) {
this.name = name;
console.log(new.target.name);
}
}
class Employee extends Person {
constructor(name, title) {
super(name);
this.title = title;
}
}
let john = new Person('John Doe'); // Person
let lily = new Employee('Lily Bush', 'Programmer'); // Employee
Code language: JavaScript (javascript)
この例では、new.target.name
は new.target のコンストラクタ参照の人間が読める名前です。
このチュートリアルでは、JavaScript の new.target
メタプロパティを使用して、関数またはコンストラクタが new
演算子を使用して呼び出されたかどうかを検出する方法を学びました。