📅  最后修改于: 2023-12-03 14:42:25.968000             🧑  作者: Mango
在 JavaScript 中,有一个特殊的元属性 new.target
,它返回构造函数、类或派生类被调用时的 new
关键字。这个元属性很有用,因为它能够让你知道使用了 new
关键字来调用某个函数。
new.target
可以在任何地方使用,但通常是在构造函数、类或派生类内部使用。在这些函数中,new.target
判断调用方式是否是 new
,并相应地执行不同的代码。
例如,在构造函数中,可以使用 new.target
创建一个新的实例:
class Foo {
constructor() {
if (!new.target) {
throw 'Foo must be called with the new operator';
}
console.log('Foo instantiated with new');
}
}
new Foo();
// Output: Foo instantiated with new
Foo();
// Output: Foo must be called with the new operator
如上例所示,如果没有使用 new
关键字调用 Foo
,则抛出一条错误信息。
如果函数没有被 new
调用,new.target
将是 undefined
。否则,它将是构造函数本身。
在派生类中使用 new.target
时,它将是派生类的构造函数,而不是基类的构造函数。
class Animal {
constructor() {
console.log(new.target.name + ' constructed');
}
}
class Cat extends Animal {
constructor() {
super();
}
}
new Animal();
// Output: Animal constructed
new Cat();
// Output: Cat constructed
如上例所示,new.target.name
可以返回构造函数的名称。
new.target
是一个很有用的元属性,它可以帮助你判断函数的调用方式,进而执行不同的代码。如果你还没有在你的代码中使用 new.target
,那么建议你尝试一下。