public / private / protected 访问修饰符与 readonly
最后更新:2026-10-22
public / private / protected 访问修饰符与 readonly
访问修饰符控制成员可见性:public(默认,内外皆可访问)、private(仅类内部)、protected(类内部与子类)。这是编译期约束——封装出错在写代码时就报错,而不是等运行时数据被误改。
| 分组 | 函数与类 |
|---|---|
| 类型 | 语法 |
| 严格模式 | 不需要 |
ℹ️ 说明 编辑器将 TypeScript 转译为 JavaScript 后运行(不做类型检查);类型检查结果见示例 Output。
📝 语法
class BankAccount {
public owner: string; // 默认即 public,写出是为了表达意图
private balance: number; // 仅类内部可读写
constructor(owner: string, initial: number) {
this.owner = owner;
this.balance = initial;
}
deposit(amount: number): void { this.balance += amount; }
getBalance(): number { return this.balance; }
}
⚙️ 参数
| public | 默认修饰符:任何位置可访问;显式写出有助于表达设计意图 |
|---|---|
| private | 仅本类的方法内可访问;外部与子类访问都编译报错 |
| protected | 本类与子类可用,外部不可用——给子类留的"受控扩展点" |
返回值:修饰符不改变方法返回类型,只约束"谁能调用、谁能读写"。
▶ 示例
修改下面的代码,点击试一试查看转译运行结果:
输出:
Mia: 150
(转译后运行输出;外部直接改 acct.balance 会得到编译错误——只能在类内部经方法修改)
💡 要点
ℹ️ 说明 private/protected 是纯编译期的:转译后字段依然在对象上(acct.balance 运行时拿得到)。需要运行时隔离用 JS 私有字段 #balance。
ℹ️ 说明 同一类的任意实例之间可以互相访问私有成员(如 equals(other: BankAccount) 里读 other.balance),这是设计使然,不算违规。
⚠️ 注意 转译后 private 失效,不要把"安全性"寄托在它上面;它防的是无意的误用,不是恶意访问。
🏷️ 相关函数与类
💡 相关案例
更多案例即将上线。
📚 相关教程
❓ 常见问题
Q private 和 #私有字段有什么区别?
A private 是 TS 编译期检查(运行时可绕过);#field 是 JS 语言级私有(运行时真拿不到)。新代码建议优先 #,需要与 TS 类型系统深度配合的场景用 private。
Q protected 什么时候用?
A 给子类留"受控扩展点":模板方法模式里父类的钩子方法、子类需要读取的内部状态。比 public 收得紧,比 private 放得开。
Q getter/setter 和 public 字段怎么选?
A 读写需要副作用(校验、缓存、派生值)时用 get/set;纯数据存取直接 public 字段,别为每个字段都包一层访问器。