摘要: 本教程将介绍 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)
您可以使用 new
运算符从 Person
函数创建新对象,如下所示
let john = new Person('John');
console.log(john.name); // john
Code language: JavaScript (javascript)
或者您可以将 Person
作为函数调用
Person('Lily');
Code language: JavaScript (javascript)
因为 this
被设置为 全局对象,即当您在 Web 浏览器中运行 JavaScript 时,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
运算符调用。