private修饰符是实现封装最直接的手段,它限制类内属性或方法仅在当前类中可访问,防止外部代码随意篡改数据,并需配合校验逻辑的getter/setter提供安全访问。

private 修饰符是实现封装最直接的手段——它让类内部的属性(或方法)仅在当前类中可访问,外部代码无法直接读取或修改,从而保护数据不被随意篡改。
为什么需要用 private 隐藏属性?
暴露 public 属性会导致外部代码绕过业务逻辑随意赋值,比如把年龄设为 -5 或 200,破坏数据有效性。用 private 把字段“关起来”,再通过受控的 getter/setter 提供安全访问,才能真正实现封装。
基本写法:声明 private 字段 + 提供访问接口
以 TypeScript 为例(Java、C# 等语法类似):
- 用 private name: string; 声明私有属性
- 不直接暴露字段,而是提供 getName() 和 setName(newName: string) 方法
- 在 setter 中加入校验逻辑,例如非空判断、格式检查、范围限制
示例:
class User {private _age: number;
constructor(age: number) {
if (age 150) throw new Error('年龄必须在 0–150 之间');
this._age = age;
}
get age(): number { return this._age; }
set age(value: number) {
if (value 150) throw new Error('年龄无效');
this._age = value;
}
}
注意命名习惯与访问限制
很多语言约定私有字段加下划线前缀(如 _name),但这只是提示,真正起作用的是 private 关键字本身。
- 子类也无法访问父类的 private 成员(区别于 protected)
- JavaScript(ES2022+)支持真正的私有字段写法:#id: string,该字段完全不可被外部(包括反射)访问
- TypeScript 编译后会移除 private,靠编译时检查保障;而 # 私有字段是运行时强制限制
封装不只是“加 private”,关键是控制访问路径
private 是起点,不是终点:
- 只暴露必要的 getter,敏感字段可不提供 setter(只读)
- setter 中做参数校验、触发更新逻辑(如通知视图刷新)
- 避免在 getter 中返回可变对象的直接引用(防止外部修改内部状态),必要时返回副本
比如返回一个 private 数组时,应写 get items(): string[] { return [...this._items]; } 而不是 return this._items;

















