javascript 中 class 实例必须通过 new 调用构造函数创建,否则抛出 typeerror;new 执行时创建空对象、绑定 this、执行构造函数并按规则返回对象。

在 JavaScript 中,class 实例必须通过 new 关键字调用构造函数来创建,否则会报错(如 Class constructor XXX cannot be invoked without 'new')。这是 ES6 class 的硬性规定,和普通函数不同。
必须用 new 调用,不能直接调用
class 声明的构造函数是“语法上不可被普通调用”的:
- ✅ 正确:
const inst = new MyClass(); - ❌ 错误:
const inst = MyClass();→ 抛出TypeError
即使 class 中没有显式写 constructor,也会有默认空构造函数,仍需 new。
new 调用时发生了什么
执行 new MyClass(...args) 时,JS 引擎自动完成四步:
- 创建一个空对象,并将其
[[Prototype]]指向MyClass.prototype - 将该对象作为
this绑定,执行MyClass构造函数体 - 若构造函数无显式
return对象,则隐式返回新创建的this对象 - 若构造函数
return了一个对象(非 null、非 primitive),则返回该对象;否则仍返回this
常见错误与避坑提示
以下写法容易出错,需注意:
-
不要用箭头函数模拟 class 构造器:箭头函数没有
prototype和new.target,无法被new调用 -
不要在 class 外部手动改写
prototype后再 new:虽技术可行,但破坏封装且易引发原型链混乱 -
继承时子类 constructor 必须先调用
super():否则访问this会报错(ReferenceError)
想绕过 new?考虑工厂函数或静态方法
如果希望更灵活地创建实例(比如根据条件返回不同子类),推荐用静态工厂方法:
class Animal {
constructor(name) {
this.name = name;
}
static create(type, name) {
if (type === 'dog') return new Dog(name);
if (type === 'cat') return new Cat(name);
return new Animal(name);
}
}
// 使用:const pet = Animal.create('dog', 'Xiaohei');
这样既保持 class 的语义清晰,又避免了直接暴露 new 调用逻辑。











