new.target 是 ES6 引入的元属性,用于检测函数是否通过 new 调用:new 调用时指向构造函数本身,普通调用时为 undefined;可防止非 new 调用、支持继承链中识别直接构造者,且在箭头函数中不可用。

new.target 是 ES6 引入的元属性,用于检测函数是否通过 new 关键字被调用。在构造函数中,它能明确区分“作为普通函数调用”和“作为构造函数调用(即创建实例)”两种场景。
new.target 的基本行为
在函数体内:
- 如果函数通过
new调用(如new MyClass()),new.target指向该构造函数本身(即MyClass); - 如果函数作为普通函数调用(如
MyClass()),new.target为undefined。
防止非 new 调用的常见写法
可利用 new.target 做运行时检查,避免误用:
function Person(name) {
if (!new.target) {
throw new Error('Person 必须通过 new 调用');
}
this.name = name;
}
这样调用会报错:Person('Alice');而 new Person('Alice') 正常执行。
立即学习“Java免费学习笔记(深入)”;
在继承链中识别实际构造者
new.target 在子类继承中指向**直接被 new 的那个类**,而非父类构造函数。这可用于实现“仅允许子类实例化”的逻辑:
class Animal {
constructor() {
if (new.target === Animal) {
throw new Error('Animal 是抽象类,不能直接实例化');
}
}
}
class Dog extends Animal {
constructor() {
super(); // 此时 new.target 是 Dog
}
}
new Animal() 报错;new Dog() 成功。
与箭头函数、普通函数的区别
new.target 在箭头函数中不可用(会报 ReferenceError),且普通函数(非构造函数)中虽可访问但始终为 undefined。它只在“被定义为构造函数意图”的函数(包括 class 构造器、function 声明/表达式)中语义明确。


















