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 字段,别为每个字段都包一层访问器。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏