constructor 是类中用于初始化实例的特殊方法,自动执行,可设属性、传参、校验;每个类至多一个,继承时子类需调用 super();不建议在其中做异步或副作用操作。

在 JavaScript 的 class 语法中,constructor 是一个特殊方法,用于初始化新创建的实例对象。它会在使用 new 关键字调用类时自动执行,主要用来设置实例属性、绑定方法或执行必要初始化逻辑。
constructor 的基本写法
每个类最多只能有一个 constructor。如果没显式定义,JavaScript 会提供一个空的默认构造函数(相当于 constructor() {})。显式编写时需注意:
- 必须使用
constructor这个固定名称,不能改名或加修饰符(如function constructor()是错的) - 若类继承自父类(用了
extends),子类的constructor中必须在访问this前调用super() - 可以接受任意数量的参数,常用于接收初始化数据并赋值给
this
示例:
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
}
const p = new Person('Alice', 30); // this.name → 'Alice', this.age → 30
带默认参数和验证的 constructor
实际开发中,常需要处理缺省值或简单校验,可在 constructor 中直接实现:
- 用默认参数避免传
undefined导致意外行为 - 用
if或三元表达式做基础检查(如非空、类型、范围) - 不建议在构造函数里做异步操作或复杂副作用(如发请求、DOM 操作),应拆到单独方法中
示例:
class BankAccount {
constructor(owner, initialBalance = 0) {
if (typeof owner !== 'string' || owner.trim() === '') {
throw new Error('Owner must be a non-empty string');
}
if (initialBalance < 0) {
throw new Error('Initial balance cannot be negative');
}
this.owner = owner.trim();
this.balance = initialBalance;
}
}
继承中 constructor 与 super 的配合
子类自定义 constructor 时,必须第一行调用 super(...),把父类需要的参数传过去。否则会报错 ReferenceError: Must call super constructor in derived class before accessing 'this'。
-
super()调用的是父类的constructor - 可以传参,参数顺序和父类构造函数一致
- 调用
super后才能使用this(包括赋值、调用方法等)
示例:
class Animal {
constructor(name) {
this.name = name;
}
}
class Dog extends Animal {
constructor(name, breed) {
super(name); // 必须先调用 super
this.breed = breed; // 然后才能用 this
}
}
const dog = new Dog('Leo', 'Golden Retriever');
不写 constructor 的情况
如果不需要初始化逻辑,或只需继承父类默认行为,完全可以省略 constructor:
- 无继承时:类会自动获得空构造函数
constructor() {} - 有继承且无额外逻辑时:可不写,直接继承父类的
constructor
例如:
class Logger {
log(msg) {
console.log(`[LOG] ${msg}`);
}
}
// 完全合法,等价于 class SilentLogger extends Logger { constructor(...args) { super(...args); } }
class SilentLogger extends Logger {}


















