javascript类是基于原型继承的语法糖,本质上还是通过原型链实现对象之间的关联,class关键字让面向对象编程的代码结构更清晰易读,不需要再手动操作原型对象。它并不是像传统面向对象语言那样存在真正的类概念,只是对原有构造函数写法的封装优化。

javascript类的核心概念
在ES6之前,javascript通过构造函数和原型对象实现面向对象编程,比如定义一个Person构造函数需要手动给prototype添加方法。而class关键字把构造器、实例方法、静态方法等整合到一个代码块中,语法更符合传统面向对象语言的书写习惯。
需要注意的是,javascript的类声明不会被提升,这和函数声明不同,必须先声明类再使用它创建实例,否则会抛出引用错误。
用class关键字定义基础类
使用class关键字定义类的语法非常简单,类名通常采用首字母大写的驼峰命名法,类内部可以定义constructor构造器、实例方法、静态方法等内容。
定义类和创建实例
下面是一个基础的Person类示例,包含构造器和实例方法:
// 定义Person类
class Person {
// 构造器,创建实例时自动执行
constructor(name, age) {
this.name = name;
this.age = age;
}
// 实例方法,会被添加到类的原型上
sayHello() {
console.log(`你好,我是${this.name},今年${this.age}岁`);
}
// 静态方法,直接通过类调用,不需要创建实例
static createAdult(name) {
return new Person(name, 18);
}
}
// 创建实例
const person1 = new Person('张三', 20);
person1.sayHello(); // 输出:你好,我是张三,今年20岁
// 调用静态方法
const person2 = Person.createAdult('李四');
person2.sayHello(); // 输出:你好,我是李四,今年18岁
上述代码中,constructor是类的构造器,用于初始化实例的属性,this指向新创建的实例。sayHello是实例方法,所有实例都可以调用,它实际上被添加到了Person.prototype上。static关键字定义的是静态方法,只能通过Person.createAdult这种形式调用,不能通过实例调用。
类的继承实现
class关键字通过extends关键字实现继承,子类可以继承父类的属性和方法,也可以重写父类的方法或者添加新的方法。
基础继承示例
下面定义一个Student类继承Person类,添加学生特有的属性和方法:
// 定义Student类继承Person类
class Student extends Person {
constructor(name, age, grade) {
// 调用父类构造器,必须在使用this之前调用
super(name, age);
this.grade = grade;
}
// 重写父类的sayHello方法
sayHello() {
console.log(`你好,我是${this.name},今年${this.age}岁,在读${this.grade}年级`);
}
// 子类特有的实例方法
study() {
console.log(`${this.name}正在学习`);
}
}
// 创建Student实例
const student1 = new Student('王五', 16, 10);
student1.sayHello(); // 输出:你好,我是王五,今年16岁,在读10年级
student1.study(); // 输出:王五正在学习
继承时需要注意,子类的constructor中必须先调用super()才能使用this,super的作用是调用父类的构造器,传入父类需要的参数。如果子类没有定义constructor,会默认生成一个调用super的构造器。
class和传统构造函数写法的对比
class语法本质上是传统构造函数写法的语法糖,下面的表格对比了两种写法的差异:
| 对比项 | 传统构造函数写法 | class关键字写法 |
|---|---|---|
| 构造器定义 | 函数本身作为构造器 | 类内部的constructor方法 |
| 实例方法定义 | 手动添加到构造函数的prototype上 | 直接在类内部定义方法,自动添加到原型 |
| 静态方法定义 | 添加到构造函数本身 | 用static关键字在类内部定义 |
| 继承实现 | 手动修改子构造函数的prototype指向父类实例,还要修正constructor指向 | 用extends关键字直接实现,自动处理原型链 |
可以看到class写法大大简化了面向对象编程的代码量,也减少了手动操作原型容易出现的错误,是现在javascript中实现面向对象编程的主流方式。
类的其他特性
除了基础的定义和继承,class还支持一些其他特性:
- getter和setter:可以在类内部定义属性的读取和设置逻辑,比如对属性值做校验
- 私有属性和方法:ES2022之后支持用#开头的属性和方法,只能在类内部访问,外部无法调用
- 表达式形式定义类:可以把类赋值给变量,或者作为返回值,适合动态创建类的场景
下面是一个使用私有属性和getter/setter的示例:
class BankAccount {
// 私有属性,只能在类内部访问
#balance = 0;
// 余额的getter
get balance() {
return this.#balance;
}
// 存款的setter
set deposit(amount) {
if (amount <= 0) {
throw new Error('存款金额必须大于0');
}
this.#balance += amount;
}
// 取款方法
withdraw(amount) {
if (amount > this.#balance) {
throw new Error('余额不足');
}
this.#balance -= amount;
}
}
const account = new BankAccount();
account.deposit = 100; // 调用setter存100
console.log(account.balance); // 调用getter输出100
account.withdraw(50);
console.log(account.balance); // 输出50
通过上述内容可以看出,class关键字让javascript的面向对象编程更加规范易用,开发者不需要再深入理解原型链的复杂细节,也能写出结构清晰的面向对象代码。只要掌握类的定义、继承、静态方法等核心用法,就能满足大部分场景的开发需求。
javascriptclass关键字面向对象编程构造函数修改时间:2026-07-11 14:51:32