最直接有效的办法是让构造函数自动判断是否被正确调用:在函数开头用 instanceof 检测 this,若不满足则递归调用 new;严格模式可强制报错;工厂函数可彻底规避 new;命名约定与工具辅助能降低出错概率。

最直接有效的办法是让构造函数“自己判断”是否被正确调用,而不是依赖开发者记住 new。只要检测到 this 不是指向该构造函数的实例,就自动补上 new 并返回新对象。
用 instanceof 检测并自动修正
在构造函数开头检查 this instanceof Constructor,不满足就递归调用自身并加 new:
- function Person(name) {
if (!(this instanceof Person)) {
return new Person(name);
}
this.name = name;
} - 这样
Person('Alice')和new Person('Alice')都能正常返回实例 - 注意:必须确保构造函数没有显式返回基本类型(如字符串、数字),否则会覆盖自动返回的对象
启用严格模式强制报错
在函数体第一行写 "use strict",让不加 new 的调用直接抛错:
- function User(name) {
"use strict";
this.name = name;
} - 调用
User('Bob')时,this为undefined,赋值会触发TypeError - 好处是问题暴露得早,但属于“防御性失败”,不能自动修复调用方式
改用工厂函数替代构造函数
彻底绕过 new,用普通函数返回对象:
- function createUser(name) {
return { name };
} - 语义清晰、无
new依赖,适合不需要原型方法或继承的场景 - 缺点是无法共享原型上的方法,每个对象都独立携带属性和方法,可能增加内存开销
命名约定 + 工具辅助
虽不能运行时防护,但能显著降低出错概率:
- 构造函数名首字母大写(如
Car、ApiService),普通函数小写(如validateInput) - 配合 ESLint 规则
new-cap,在编辑器里实时提示未用new调用大写函数 - 团队代码审查时重点关注大写字母开头的函数调用是否带
new
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











