ES6的class本质是基于原型的构造函数语法糖,必须配合constructor使用,其为默认初始化方法,用于设置实例属性;子类中需首行调用super(),且class不被提升。

ES6 的 class 语法是函数声明的语法糖,本质仍是基于原型的构造函数,但写法更清晰、语义更明确。它必须配合 constructor 方法使用——这是类的默认初始化方法,用于设置实例属性和执行初始化逻辑。
基本声明:class + constructor
一个最简类需包含 class 关键字、类名和一个 constructor 方法:
-
constructor是唯一能定义的特殊方法(不能重名,否则报错) - 若不显式声明,JavaScript 会自动添加一个空的
constructor() {} - 创建实例时(
new MyClass()),constructor会自动调用
示例:
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
}
const p = new Person('小明', 25); // this.name → '小明',this.age → 25
constructor 中必须用 this 初始化实例属性
在 constructor 内,this 指向新创建的实例。所有需要挂载到实例上的属性,都应在此赋值:
- 直接写
this.xxx = value,否则该属性不会出现在实例上 - 不能在 class 顶层(constructor 外)写
this.xxx = ...,会报错 - 可配合解构、默认参数等增强可读性
例如支持默认值:
class Car {
constructor(brand = '未知', model = '普通版') {
this.brand = brand;
this.model = model;
this.isRunning = false;
}
}
constructor 可调用 super()(子类中)
当类继承自另一个类(用 extends)时,子类的 constructor 必须第一行调用 super(),以初始化父类的 this:
- 不调用
super()会报ReferenceError -
super()相当于执行父类的constructor,可传参 - 调用
super()后才能使用this
示例:
class Animal {
constructor(name) {
this.name = name;
}
}
class Dog extends Animal {
constructor(name, breed) {
super(name); // 必须先调用
this.breed = breed;
}
}
const dog = new Dog('旺财', '金毛'); // this.name 来自 Animal,this.breed 是 Dog 自有
注意:class 声明不会被提升
与函数声明不同,class 是块级作用域且不被提升:
- 必须先声明 class,再用
new实例化,否则报ReferenceError - 不能在声明前访问类名(包括 typeof 判断)
- 推荐将 class 放在文件顶部或按依赖顺序组织
错误写法:
const a = new MyClass(); // ReferenceError: Cannot access 'MyClass' before initialization
class MyClass { constructor() {} }
不复杂但容易忽略。掌握 class 和 constructor 的配合逻辑,就能写出清晰、可维护的面向对象代码。











