TypeScript 类中提供的 public、private 和 protected 修饰符的作用理解
把类想象成一栋三层小楼:
-
public(客厅)
谁都能进来,想坐坐沙发、看看电视都行。
默认不加修饰符就是 public。class House {public tv = '大彩电'; // 外面随便用 } const h = new House(); console.log(h.tv); // 大彩电
-
private(保险箱)
只有屋主自己能开,连亲儿子都碰不到。class House {private safe = '金条'; } const h = new House(); console.log(h.safe); // ❌ 编译报错:外人看不见
-
protected(父母卧室)
外人不能进,但儿子可以进来拿东西。class House {protected bedroom = '爸妈的床'; }class Son extends House {show() {console.log(this.bedroom); // ✅ 儿子能进} }const h = new House(); console.log(h.bedroom); // ❌ 外人不行
一句话总结:
- public:随便看随便摸(默认)。
- private:只有类自己能摸。
- protected:自己和“孩子”能摸,外人不行。
提醒一下:
protected 并不是“只能”在子类里用,而是“子类也能用,外人不能用”。
- 在父类内部:照样可以访问自己的 protected 成员。
- 在子类内部:也可以访问继承来的 protected 成员。
- 在类外面(任何实例或其它类):统统不能碰。
举个完整例子:
class Animal {protected leg: number = 4; // 父类自己能用walk() {console.log(`我用 ${this.leg} 条腿走路`); // ✅ 父类内部 OK}
}class Dog extends Animal {bark() {console.log(`我有 ${this.leg} 条腿,汪!`); // ✅ 子类内部 OK}
}const a = new Animal();
const d = new Dog();console.log(a.leg); // ❌ 报错:类外禁止
console.log(d.leg); // ❌ 报错:类外禁止
所以:
protected 并不局限于子类,而是“类自己 + 子类”都能访问,类外一律禁止。
一句话区分protected和private:
private 是“私房钱”,除了自己谁都不能看;
protected 是“传家宝”,自己和孩子能看,外人不行。
场景 | private | protected |
---|---|---|
本类内部 | ✅ 可以访问 | ✅ 可以访问 |
子类内部 | ❌ 不能访问 | ✅ 可以访问 |
类的外面(实例、其他类) | ❌ 不能访问 | ❌ 不能访问 |
快速代码对比:
class Parent {private secret = '私房钱';protected heirloom = '传家宝';
}class Child extends Parent {show() {console.log(this.secret); // ❌ 报错:私房钱孩子不能碰console.log(this.heirloom); // ✅ OK:传家宝孩子可以继承}
}const p = new Parent();
console.log(p.secret); // ❌ 外人不能看
console.log(p.heirloom); // ❌ 外人也不能看
总结:
- 想彻底隐藏 → 用 private。
- 允许子类继承使用 → 用 protected。