JavaScript 的 class 是函数和原型的语法糖,本质仍基于原型继承;支持构造器、实例/静态方法、extends 继承(需 super)、getter/setter 及私有字段(#),但不提升且默认严格模式。

JavaScript 中用 class 语法写面向对象代码,本质是函数和原型的语法糖,写法更清晰、结构更接近传统 OOP 语言(比如 Java、C#),但底层仍是基于原型的继承机制。
定义类和构造方法
用 class 关键字声明类,constructor() 方法在实例化时自动调用,用于初始化属性:
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
}
const alice = new Person('Alice', 30);
console.log(alice.name); // 'Alice'
添加实例方法和静态方法
方法直接写在类体中,默认是实例方法;加 static 修饰的是静态方法,属于类本身,不绑定实例:
- 实例方法可访问
this,操作当前实例数据 - 静态方法常用于工具函数、工厂方法或与类相关但不依赖实例的逻辑
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
// 实例方法
greet() {
return `Hello, I'm ${this.name}`;
}
// 静态方法
static createAdult(name) {
return new Person(name, 18);
}
}
const p = new Person('Bob', 25);
console.log(p.greet()); // 'Hello, I'm Bob'
console.log(Person.createAdult('Charlie').age); // 18
实现继承(extends 和 super)
用 extends 继承父类,子类构造器中必须先调用 super()(否则报错),以初始化父类的 this:
立即学习“Java免费学习笔记(深入)”;
-
super()调用父类构造器,传参要匹配 -
super.xxx可调用父类的方法或属性(包括被重写的)
class Student extends Person {
constructor(name, age, grade) {
super(name, age); // 必须!
this.grade = grade;
}
study() {
return `${this.name} is studying in grade ${this.grade}`;
}
// 重写父类方法
greet() {
return super.greet() + ' and I am a student';
}
}
const s = new Student('Diana', 20, 'A');
console.log(s.greet()); // 'Hello, I'm Diana and I am a student'
使用 getter/setter 和私有字段(现代写法)
可用 get/set 定义计算属性;ES2022 起支持真正的私有字段(用 # 前缀),只能在类内部访问:
class BankAccount {
#balance = 0; // 私有字段
constructor(initial) {
this.#balance = initial;
}
get balance() {
return this.#balance;
}
set balance(value) {
if (value >= 0) this.#balance = value;
}
deposit(amount) {
this.#balance += amount;
}
}
const acc = new BankAccount(100);
console.log(acc.balance); // 100
acc.deposit(50);
console.log(acc.balance); // 150
// console.log(acc.#balance); // SyntaxError:无法访问私有字段
不复杂但容易忽略:class 声明不会被提升,必须先定义再使用;所有 class 内部代码默认运行在严格模式下;箭头函数不能用作 class 方法(它没有自己的 this,会破坏上下文绑定)。


















