源本科技 | 码上会

JavaScript 中的类

2026/01/13
15
0

学习目标

  • 掌握 ES6 中 class 语法的基本结构与使用方法

  • 理解构造函数(constructor)在类中的作用

  • 学会通过类创建多个具有相同结构的对象实例

  • 掌握类的继承机制,能够使用 extendssuper 实现代码复用

  • 理解 JavaScript 类如何支持封装、复用与模块化开发


类简介

ES6(ECMAScript 2015)引入了 class 语法,为 JavaScript 提供了一种更清晰、更结构化的方式来实现面向对象编程。虽然底层仍基于原型(prototype),但 class 语法让代码更接近传统 OOP 语言(如 Java、C#)的风格。

基本语法

class ClassName {
    constructor(/* 参数 */) {
        // 初始化实例属性
    }

    // 定义方法
    methodName() {
        // 方法逻辑
    }
}
  • class 关键字用于声明一个类

  • constructor() 是特殊方法,在使用 new 创建实例时自动调用

  • 类中可定义多个方法,这些方法会被所有实例共享


创建简单类并实例化对象

下面是一个定义“人”类的示例:

class Person {
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }

    greet() {
        console.log(`你好,我的名字是 ${this.name},今年 ${this.age} 岁。`);
    }
}

const person1 = new Person("张伟", 28);
person1.greet(); // 输出:你好,我的名字是 张伟,今年 28 岁。

说明

  • constructor 接收参数并初始化 this.namethis.age

  • greet 是一个普通方法,可通过实例调用

  • 使用 new Person(...) 创建新对象实例


构造函数的作用

构造函数是类的核心部分,用于在对象创建时初始化其属性

class Car {
    constructor(brand, model, year) {
        this.brand = brand;
        this.model = model;
        this.year = year;
    }

    displayInfo() {
        console.log(`${this.year} 年款 ${this.brand} ${this.model}`);
    }
}

const myCar = new Car("丰田", "卡罗拉", 2021);
myCar.displayInfo(); // 输出:2021 年款 丰田 卡罗拉

每个实例都拥有自己独立的属性值,但共享相同的方法定义。


类的继承

JavaScript 类支持单继承,即一个子类可以继承一个父类的所有属性和方法,并可扩展或重写功能。

使用 extendssuper

// 父类
class Car {
    constructor(brand, model, year) {
        this.brand = brand;
        this.model = model;
        this.year = year;
    }

    displayBasicInfo() {
        console.log(`${this.year} ${this.brand} ${this.model}`);
    }
}

// 子类
class ElectricCar extends Car {
    constructor(brand, model, year, batteryLife) {
        super(brand, model, year); // 调用父类构造函数
        this.batteryLife = batteryLife; // 新增属性
    }

    displayBatteryInfo() {
        console.log(`电池续航时间:${this.batteryLife} 小时`);
    }
}

const tesla = new ElectricCar("特斯拉", "Model S", 2022, 24);
tesla.displayBasicInfo();   // 输出:2022 特斯拉 Model S
tesla.displayBatteryInfo(); // 输出:电池续航时间:24 小时

关键点

  • extends 表示继承关系

  • super(...) 必须在子类构造函数中调用,用于初始化父类属性

  • 子类可新增属性(如 batteryLife)和方法(如 displayBatteryInfo


批量创建对象实例

类的最大优势之一是能够高效创建多个结构一致但数据不同的对象

class Book {
    constructor(title, author, isbn) {
        this.title = title;
        this.author = author;
        this.isbn = isbn;
    }

    getInfo() {
        return `${this.title} —— 作者:${this.author}`;
    }
}

const book1 = new Book("JavaScript 高级程序设计", "马特·弗里斯比", "978-7-115-12345-6");
const book2 = new Book("你不知道的 JavaScript", "凯尔·辛普森", "978-7-115-67890-1");

console.log(book1.getInfo()); // 输出:JavaScript 高级程序设计 —— 作者:马特·弗里斯比
console.log(book2.getInfo()); // 输出:你不知道的 JavaScript —— 作者:凯尔·辛普森

这种方式避免了重复代码,提升了可维护性。


类的核心特性

特性

说明

封装性

将数据(属性)与行为(方法)组织在同一个类中

构造函数

用于初始化对象的初始状态

继承机制

通过 extendssuper 实现代码复用与扩展

代码复用

多个实例共享方法定义,减少内存开销

结构清晰

语法简洁直观,便于团队协作与大型项目开发

注意:JavaScript 的类本质上仍是基于原型的语法糖,理解原型链有助于深入掌握其运行机制。


重点总结

  • 使用 class 声明类,constructor 初始化属性

  • 通过 new 创建类的实例

  • 方法直接定义在类体内,无需加 function 关键字

  • 子类使用 extends 继承父类,用 super() 调用父类构造函数

  • 类支持创建多个独立实例,适用于建模现实世界实体


思考题

  1. 如果在类中没有显式定义 constructor,JavaScript 会如何处理?尝试写一个无构造函数的类并创建实例。

  2. 在继承中,如果子类重写了父类的某个方法,如何在子类方法中调用父类的原始实现?

  3. 设计一个 Animal 类作为基类,再派生出 DogCat 两个子类,分别重写 speak() 方法使其输出不同叫声,并通过实例验证多态行为。