new.target 是 ES6 元属性,指向当前被 new 调用的构造函数;普通调用时为 undefined,可用于强制构造函数调用、类继承中识别实际构造类及实现抽象类效果。
new.target 是 es6 引入的元属性,它在函数执行时返回一个引用,指向当前被调用的构造函数。若函数不是通过 new 调用(即作为普通函数调用),new.target 的值为 undefined。利用这一特性,可以强制函数只能作为构造函数使用。
检测是否通过 new 调用
在函数体开头检查 new.target 是否为 undefined,即可判断调用方式:
- 如果
new.target === undefined,说明是普通调用,应抛出错误 - 如果
new.target是一个函数(通常是当前函数本身),说明是通过new调用的
实现构造函数的调用约束
常见写法是在函数内做校验,并提前终止非法调用:
function Person(name) {
if (!new.target) {
throw new TypeError('Person must be called with new');
}
this.name = name;
}
这样调用会成功:const p = new Person('Alice');;而直接调用 Person('Alice') 会立即报错。
箭头函数中不能使用 new.target
箭头函数没有自己的 new.target,它会沿作用域链向上查找。但更关键的是:箭头函数**不能作为构造函数**,调用 new () => {} 会直接抛出 TypeError。因此,new.target 只应在普通函数或类的构造方法中使用。
类的 constructor 中 new.target 的行为
在 class 的构造器中,new.target 指向实际被 new 的类(支持继承场景):
- 直接
new A()→new.target === A - 若
B extends A,然后new B()→new.target === B - 可用于实现“抽象类”效果:在父类 constructor 中检查
new.target === A,不相等才允许实例化










