JavaScript中class语法强制使用new关键字,这是由引擎在运行时检查[[IsConstructor]]标志并抛出TypeError实现的,而非额外逻辑;class本质是只能通过new调用的特殊函数,不加new会立即报错且无法绕过。

JavaScript 中 class 语法强制使用 new 关键字,不是靠额外检查逻辑实现的,而是语言底层机制决定的——它在内部做了运行时判断:如果调用 class 构造函数时没有通过 new,引擎会直接抛出 TypeError。
class 本质是带限制的函数
class 声明本质上是一个特殊的函数(即“语法糖”),但它被设计为只能由 new 触发。和普通函数不同:
- 普通构造函数(如
function Person(){})即使不加new也能执行,只是this指向全局或undefined(严格模式下); - 而 class 定义的函数,引擎在调用前会检查内部标志 [[IsConstructor]] 是否为 true,且要求必须通过
new调用,否则立即报错。
错误调用会直接中断执行
比如下面这段代码:
class Dog {
constructor(name) {
this.name = name;
}
}
Dog('Xiaohei'); // ❌ TypeError: Class constructor Dog cannot be invoked without 'new'
这个错误在调用瞬间就抛出,无法被 try/catch 绕过(除非你根本没执行这行),也不依赖任何用户写的判断逻辑。
立即学习“Java免费学习笔记(深入)”;
为什么这样设计?
主要为避免两类常见问题:
-
this 绑定错误:不加
new时,class 内部的this无法指向预期实例,极易导致属性赋值丢失或静默失败; - 语义清晰:明确区分“创建实例”和“调用工具函数”,让面向对象意图一目了然。
不能绕过,也不该绕过
有人尝试用 Reflect.construct() 或手动模拟 new,但这只是换种方式调用,并未跳过强制约束——它们依然属于“构造调用”,仍需符合 class 的初始化流程。试图用 call/apply 直接调用 class 构造函数,结果仍是报错。


















