🏗️ 第八章:面向对象编程

掌握类的基本语法和面向对象编程的核心概念

8.1 类的基本语法

// 类的定义
class Person {
    // 构造函数
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }
    
    // 实例方法
    greet() {
        return `Hello, my name is ${this.name} and I am ${this.age} years old.`;
    }
    
    // 静态方法
    static createAdult(name) {
        return new Person(name, 18);
    }
}

// 创建实例
const john = new Person('John', 30);
console.log(john.greet()); // Hello, my name is John and I am 30 years old.

// 使用静态方法
const adult = Person.createAdult('Jane');
console.log(adult.age); // 18

8.2 构造函数、实例方法与静态方法

构造函数

实例方法

静态方法

8.3 继承与超级

// 父类
class Animal {
    constructor(name) {
        this.name = name;
    }
    
    speak() {
        return 'Animal sound';
    }
}

// 子类
class Dog extends Animal {
    constructor(name, breed) {
        super(name); // 调用父类构造函数
        this.breed = breed;
    }
    
    // 重写父类方法
    speak() {
        return 'Woof!';
    }
    
    // 调用父类方法
    speakLikeAnimal() {
        return super.speak();
    }
}

// 创建实例
const dog = new Dog('Buddy', 'Golden Retriever');
console.log(dog.name); // Buddy
console.log(dog.breed); // Golden Retriever
console.log(dog.speak()); // Woof!
console.log(dog.speakLikeAnimal()); // Animal sound

8.4 Getter/Setter 与私有字段

Getter/Setter

class Person {
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }
    
    // Getter
    get fullInfo() {
        return `${this.name}, ${this.age} years old`;
    }
    
    // Setter
    set age(newAge) {
        if (newAge >= 0) {
            this._age = newAge;
        } else {
            throw new Error('Age cannot be negative');
        }
    }
    
    get age() {
        return this._age;
    }
}

const person = new Person('John', 30);
console.log(person.fullInfo); // John, 30 years old
person.age = 31;
console.log(person.age); // 31

私有字段

class Person {
    // 私有字段
    #privateField;
    
    constructor(name) {
        this.name = name;
        this.#privateField = 'private value';
    }
    
    // 访问私有字段
    getPrivateField() {
        return this.#privateField;
    }
    
    // 修改私有字段
    setPrivateField(value) {
        this.#privateField = value;
    }
}

const person = new Person('John');
console.log(person.name); // John
console.log(person.#privateField); // 语法错误
console.log(person.getPrivateField()); // private value
person.setPrivateField('new private value');
console.log(person.getPrivateField()); // new private value

8.5 ES2025/2026 特性:类的装饰器

装饰器是元编程的利器,可以在不修改类代码的情况下增强类的功能。

基本装饰器

// 定义装饰器
function log(target, propertyName, descriptor) {
    const originalMethod = descriptor.value;
    descriptor.value = function(...args) {
        console.log(`Calling ${propertyName} with ${args}`);
        const result = originalMethod.apply(this, args);
        console.log(`${propertyName} returned ${result}`);
        return result;
    };
    return descriptor;
}

// 使用装饰器
class Calculator {
    @log
    add(a, b) {
        return a + b;
    }
}

const calc = new Calculator();
calc.add(1, 2); // 输出调用和返回信息

装饰器的应用场景

动手练习

练习 1:类的基本使用

  1. 创建一个类并添加构造函数
  2. 添加实例方法和静态方法
  3. 创建类的实例并调用方法

练习 2:继承

  1. 创建一个父类
  2. 创建一个子类继承父类
  3. 重写父类方法
  4. 使用 super 调用父类方法

练习 3:Getter/Setter 和私有字段

  1. 添加 Getter 和 Setter
  2. 使用私有字段
  3. 测试字段的访问控制

练习 4:装饰器

  1. 创建一个简单的装饰器
  2. 应用装饰器到类方法
  3. 测试装饰器的功能