new.target 是 es6 引入的元属性,用于检测函数是否被 new 调用:若为构造调用则值为构造函数本身,否则为 undefined;常用于统一接口、强制构造及避免 this 问题,但不可在箭头函数或全局作用域使用。

new.target 是 ES6 引入的元属性,用于检测函数是否被 new 调用。它在函数体内可用,值为构造函数本身(当用 new 调用时),否则为 undefined(普通调用时)。
判断调用方式的核心逻辑
只要函数体中访问 new.target,就能直接区分调用场景:
- 如果
new.target !== undefined→ 当前函数正被当作构造函数使用(即通过new Fn()调用) - 如果
new.target === undefined→ 函数被普通调用(如Fn()或Fn.call(obj))
常见应用场景
最典型的是让函数既支持构造调用又支持普通调用,并做不同处理:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 强制构造调用:防止被误当成普通函数调用
-
统一接口设计:比如类工厂函数,
new MyClass()和MyClass()都返回实例 -
避免 this 绑定问题:普通调用时
this可能是undefined(严格模式),而new.target更可靠
实际写法示例
下面是一个兼容两种调用方式的构造函数:
function Person(name) {
if (!new.target) {
// 普通调用:返回新实例,等价于 new Person(name)
return new Person(name);
}
this.name = name;
}
这样写后,Person('Alice') 和 new Person('Alice') 都能正确返回实例,不会报错或返回 undefined。
注意点
new.target 在箭头函数中不可用(因为箭头函数没有自己的 this 和 new.target),且只在函数体内有效;在全局作用域或普通代码块中访问会报语法错误。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










