访问修饰符(public、private、protected)

TypeScript作为JavaScript的超集,为JavaScript带来了强大的面向对象编程能力。其中,访问修饰符是TypeScript面向对象特性的重要组成部分,它允许开发者精确控制类成员的可见性和可访问性。本文将深入探讨TypeScript中的三种主要访问修饰符:public、private和protected。

访问修饰符概述

访问修饰符是面向对象编程中封装特性的关键实现方式,它定义了类成员(属性和方法)的可访问范围:

typescript 复制代码
class Person {
    public name: string;       // 公共成员
    private age: number;       // 私有成员
    protected id: string;     // 受保护成员
}

public修饰符

public是默认的访问级别,当不显式指定修饰符时,成员默认为public。

typescript 复制代码
class Animal {
    public name: string;
    
    constructor(name: string) {
        this.name = name;
    }
}

const dog = new Animal('Buddy');
console.log(dog.name);  // 可以访问

特点:

  • 可以在类的内部、外部和子类中访问
  • 是默认的访问级别,可以省略不写
  • 提供了最宽松的访问控制

private修饰符

private成员只能在声明它们的类内部访问。

typescript 复制代码
class BankAccount {
    private balance: number;
    
    constructor(initialBalance: number) {
        this.balance = initialBalance;
    }
    
    public getBalance(): number {
        return this.balance;  // 类内部可以访问
    }
}

const account = new BankAccount(1000);
console.log(account.getBalance());  // 正确
// console.log(account.balance);    // 错误:外部不能访问

特点:

  • 只能在定义它们的类内部访问
  • 子类和其他外部代码都无法访问
  • 提供了最严格的封装
  • 在运行时(编译为JavaScript后)实际上仍然可访问,这是TypeScript的类型检查特性

protected修饰符

protected成员可以在类内部和子类中访问,但不能从类的外部访问。

typescript 复制代码
class Vehicle {
    protected speed: number = 0;
    
    protected accelerate(): void {
        this.speed += 10;
    }
}

class Car extends Vehicle {
    public drive(): void {
        this.accelerate();  // 子类可以访问protected方法
        console.log(`Driving at ${this.speed} km/h`);  // 子类可以访问protected属性
    }
}

const car = new Car();
car.drive();
// car.speed = 100;  // 错误:外部不能访问

特点:

  • 介于public和private之间的访问级别
  • 允许子类继承和访问,但不向外部公开
  • 常用于构建类层次结构中的共享实现细节

访问修饰符的最佳实践

  1. 最小权限原则:默认使用private,只在必要时提升访问级别
  2. API设计:public成员构成类的公共API,应保持稳定
  3. 封装性:使用private和protected隐藏实现细节
  4. 继承设计:protected成员用于设计可扩展的类层次结构

对比JavaScript的私有字段

TypeScript的private是编译时检查,而ES2019+引入了真正的私有字段语法:

typescript 复制代码
class Example {
    #realPrivateField: string;  // 真正的私有字段
    
    constructor() {
        this.#realPrivateField = "secret";
    }
}

总结

TypeScript的访问修饰符为面向对象编程提供了强大的封装能力:

  • public:默认级别,无访问限制
  • private:严格的类内部访问控制
  • protected:允许子类继承的受保护访问

合理使用这些修饰符可以创建出结构良好、易于维护且安全的类设计,是TypeScript面向对象编程中不可或缺的工具。