new.target 是一个元属性,用于检测函数是否被 new 调用:new 调用时指向当前构造函数,普通调用时为 undefined,箭头函数中继承外层值;核心作用是防止构造函数被误作普通函数调用。

new.target 在构造函数中用于检测函数是否被 new 关键字调用,它不是直接用来处理 this 的,而是辅助判断调用方式,从而决定 this 是否为合法实例对象。它的核心作用是防止构造函数被误作普通函数调用。
new.target 是什么
new.target 是一个元属性(meta property),在函数体内可用:
- 当函数通过
new调用时,new.target指向当前构造函数(即被new的那个函数); - 当函数作为普通函数调用(无
new)时,new.target为undefined; - 在箭头函数中,
new.target继承自外层函数(箭头函数本身不能作为构造函数,也不允许new调用)。
用 new.target 防止非 new 调用
如果构造函数逻辑依赖 this 是新创建的实例(比如要添加属性、调用原型方法),但用户忘了写 new,this 就会指向全局对象(非严格模式)或 undefined(严格模式),导致静默错误或污染全局。用 new.target 可主动报错:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
function Person(name) {
if (!new.target) {
throw new Error('Person 必须用 new 调用');
}
this.name = name;
}
// ✅ 正确
const p1 = new Person('Alice');
// ❌ 报错:Person 必须用 new 调用
// const p2 = Person('Bob');
在继承链中识别实际构造者
子类继承父类时,父类构造函数里的 new.target 指向的是**最底层被 new 的那个类**,不是父类自身。这可用于实现“可继承的单例”或差异化初始化:
class Animal {
constructor(name) {
// new.target 是实际被 new 的类,可能是 Animal 或 Dog
console.log('new.target:', new.target.name); // "Animal" 或 "Dog"
this.name = name;
}
}
class Dog extends Animal {
constructor(name, breed) {
super(name);
if (new.target === Dog) {
this.breed = breed;
}
}
}
new Animal('Lion'); // new.target: "Animal"
new Dog('Buddy', 'Golden'); // new.target: "Dog"
与 this 的关系:间接但关键
new.target 不改变 this 的绑定,但它能告诉你 this 是否可信:
- 若
new.target存在 →this是新创建的实例对象,可安全赋值和操作; - 若
new.target为undefined→this不可靠,应拒绝执行或抛出错误; - 不建议在非构造场景下强行模拟
this行为(如用Object.create()+apply),而应统一用new.target做守门人。
不复杂但容易忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










