概要: このチュートリアルでは、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); // johnCode language: JavaScript (javascript)または、Person を関数として呼び出すこともできます。
Person('Lily');Code language: JavaScript (javascript)JavaScript を Web ブラウザで実行する場合、this は グローバルオブジェクト、つまり window オブジェクトに設定されるため、name プロパティは次のように window オブジェクトに追加されます。
console.log(window.name); //LilyCode 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'); // EmployeeCode language: JavaScript (javascript)この例では、new.target.name は new.target のコンストラクタ参照の人間が読める名前です。
このチュートリアルでは、JavaScript の new.target メタプロパティを使用して、関数またはコンストラクタが new 演算子を使用して呼び出されたかどうかを検出する方法を学びました。