构造函数可通过this instanceof 构造函数名判断是否漏写new:若不成立,说明被普通调用,此时抛错;class语法则天然禁止无new调用并自动报错。

构造函数本身无法直接“监控”是否漏写 new,但可以通过在函数体内检测 this 的类型(是否为当前构造函数的实例)来**主动识别并报错**,从而防止因忘记 new 导致的静默错误。核心思路是:若没用 new 调用,this 会指向全局对象(非严格模式)或 undefined(严格模式),此时它**不是**该构造函数的实例,可据此抛出错误。
在构造函数内部用 instanceof 判断 this
这是最常用、最直观的方式。在函数体开头检查 this instanceof 构造函数名,不成立则说明被当作普通函数调用了:
function Person(name) {
if (!(this instanceof Person)) {
throw new Error('Person must be called with new');
}
this.name = name;
}
// ✅ 正确
const p1 = new Person('Alice');
// ❌ 报错:Person must be called with new
// const p2 = Person('Bob'); // 漏写 new
兼容严格模式与箭头函数的注意事项
严格模式下,没用 new 调用时 this 是 undefined,undefined instanceof Person 直接返回 false,判断依然有效;但注意:箭头函数不能作为构造函数,也不支持 new,所以此方法只适用于普通 function 声明或 function 表达式。
更健壮的写法:同时检查 this 是否为实例或为 undefined
为避免某些边界情况(如被 call/apply 显式传入非实例对象),可增强判断逻辑:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
function Person(name) {
if (!(this instanceof Person) || this.constructor !== Person) {
throw new Error('Person must be called with new');
}
this.name = name;
}
不过对大多数场景,仅用 this instanceof Person 已足够可靠。
现代替代方案:使用 class 语法(推荐)
ES6 class 构造器天然禁止无 new 调用——直接调用会立即抛出 TypeError: Class constructor Person cannot be invoked without 'new',无需手动判断:
class Person {
constructor(name) {
this.name = name;
}
}
// ✅
const p = new Person('Charlie');
// ❌ TypeError(浏览器/Node.js 原生报错)
// const q = Person('David');
因此,除非需兼容极老环境,否则优先使用 class,既语义清晰又自带防护。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










