JavaScript 的 class 是构造函数的语法糖,基于原型链,需用 new 调用;定义需 constructor,方法直接声明,静态方法加 static;继承用 extends 和 super(),子类 constructor 必须首行调用 super()。

JavaScript 中的 class 不是传统面向对象语言里的“类”,它只是构造函数的语法糖,底层仍基于原型链。直接用 class 定义不会改变继承本质,但写法更清晰、约束更强(比如必须用 new 调用,否则报 TypeError: Class constructor X cannot be invoked without 'new')。
如何定义一个基础 class
用 class 关键字 + 类名 + 花括号,内部至少需一个 constructor 方法(不写会自动生成空构造器):
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
}
注意:constructor 是唯一能用于初始化实例属性的方法;类体中不能写变量声明或表达式语句(比如 let x = 1 或 console.log()),否则报 Unexpected token。
如何添加方法和静态成员
方法直接写在类体内,不加 function 关键字;静态方法用 static 前缀,只能通过类名调用:
立即学习“Java免费学习笔记(深入)”;
- 实例方法(如
sayHello)会被添加到Person.prototype上 - 静态方法(如
createAdmin)挂载在Person函数本身上,不可被实例访问 - 字段声明(如
level = 1)属于 ES2022 提案,需确保运行环境支持(Node.js ≥16.0 或现代浏览器),否则会报Unexpected token
class User {
level = 1; // 公共字段(非静态)
constructor(name) {
this.name = name;
}
greet() {
return `Hi, ${this.name}`;
}
static createAdmin() {
return new User('admin');
}
}
如何实现继承:extends 和 super 的配合
子类必须在 constructor 中第一行调用 super(),否则报 ReferenceError: Must call super constructor in derived class before accessing 'this'。这是因为子类实例的 this 依赖父类构造器初始化:
-
super()用于调用父类构造器,传参要匹配父类constructor参数 -
super.xxx可访问父类的原型方法或静态属性(但不能在constructor外部单独写super()) - 子类若没写
constructor,会自动补上constructor(...args) { super(...args); }
class Admin extends User {
constructor(name, role) {
super(name); // 必须!
this.role = role;
}
info() {
return `${super.greet()} (${this.role})`;
}
}
常见陷阱与兼容性提醒
class 声明不会被提升(hoist),必须先定义后使用,否则报 ReferenceError;而函数声明会提升。另外,class 内部默认启用严格模式,所以 this 不会自动绑定到全局对象——这点在事件回调或定时器里容易出错,需手动 bind 或用箭头函数。
如果需要兼容旧环境(如 IE),得用 Babel 编译成构造函数形式;且注意:Babel 对私有字段(#private)的转换是模拟实现,行为与原生不完全一致。











