javascript中类必须用new调用,否则立即抛出typeerror;而普通构造函数不加new也能执行,但this指向失控且隐患隐蔽。

传统构造函数没有强制要求必须用 new 调用,而 ES6 class 是硬性约束——不加 new 就会直接报 TypeError。这个差异不是风格问题,而是设计层面的保护机制。
class 必须 new:运行时报错,不可绕过
class 声明后,调用时若省略 new,JavaScript 引擎会立即抛出错误,例如:
TypeError: Class constructor Person cannot be invoked without 'new'这个检查发生在运行时,且无法被 try/catch 拦截为普通逻辑错误(它属于早期执行异常)。即使你在 class 内部尝试用 new.target 判断并降级处理,也来不及——引擎在进入 constructor 之前就已拒绝执行。
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
构造函数可不 new:但 this 指向失控,隐患隐蔽
函数构造器本身是普通函数,不加 new 也能运行,只是 this 会绑定到全局对象(非严格模式)或变为 undefined(严格模式):
- 非严格模式下:
Person('Alice', 30)可能意外给window.name赋值,污染全局 - 严格模式下:
this.name = name报 TypeError,但错误位置在赋值行,而非调用处,排查更难 - 返回值行为不同:不 new 时,函数返回显式 return 的值;加 new 后,除非 return 显式对象,否则始终返回新实例
如何验证是否被正确 new 调用
两种方式都可用 new.target 检测,但 class 中它永远有值,构造函数中才需主动判断:
- 在 class 的
constructor中,new.target恒等于该 class 本身,无需额外判断 - 在构造函数中,可写:
if (!new.target) throw new Error('必须用 new 调用') - 注意:箭头函数没有
new.target,也不能作为构造器使用
为什么 class 要这么严格
这不是限制,而是对面向对象语义的强化:
- 避免把类误当普通工具函数调用,防止静默失败
- 确保实例初始化流程完整(如原型链设置、内部属性初始化)
- 配合 class 的其他约束(如严格模式、无提升)形成一致的行为边界










