getter/setter 封装核心是收归属性读写控制权,通过私有字段+公有访问器注入校验、转换、缓存等逻辑;需避免 setter 副作用、谨慎处理 getter 性能与副作用,并善用 readonly 或文档明确只读意图。

用 Getter/Setter 封装内部属性,核心是把对属性的读写控制权收归类自身,从而在不暴露原始字段的前提下,注入校验、转换、副作用或缓存等逻辑。
用私有字段 + public getter/setter 控制访问
避免直接暴露可变字段(如 public name: string),改用私有字段(private _name: string)配合 getter/setter 提供受控接口:
- setter 中可做输入校验(如非空、格式、范围)、标准化(去空格、转大小写)、触发更新(如通知视图重绘)
- getter 中可做惰性计算(如拼接 fullName)、缓存结果(避免重复解析)、权限过滤(返回脱敏值)
- TypeScript 中需开启
useDefineForClassFields: false(旧版)或确保构造函数中初始化私有字段,避免 undefined 风险
避免 setter 中引发意外副作用
setter 理应“看起来像赋值”,但实际执行复杂逻辑时容易让调用者困惑。注意:
- 不要在 setter 里发起网络请求、修改 DOM 或触发全局状态变更——这些应显式调用方法(如
save()) - 若必须联动更新其他字段,确保逻辑可预测(如
set age(n) { this._age = n; this._isAdult = n >= 18; }) - 避免 setter 调用异步操作;如需异步响应,建议改为
async updateAge(n: number)方法
利用 getter 实现只读计算属性
某些值天然不应被外部直接设置(如数组长度、对象哈希值、格式化时间),用 getter 封装更安全清晰:
-
get fullName() { return `${this.firstName} ${this.lastName}`; }—— 自动组合,无需手动维护 -
get isValid() { return this.email && this.email.includes('@'); }—— 封装业务规则 - 搭配
readonly修饰符(TS)或文档说明,明确表达“只读”意图,比单纯省略 setter 更友好
谨慎处理 getter 中的副作用和性能
getter 应尽量保持无副作用、低开销。否则可能引发难以调试的问题:
- 避免在 getter 中修改内部状态(如自增计数器)、发请求、或执行耗时遍历
- 若计算成本高(如深度克隆、正则匹配大量文本),考虑加缓存(
private _cachedResult)或改用方法(calculateExpensiveValue()) - 框架(如 Vue、Angular)会依赖 getter 响应式更新,频繁触发或不可预测的 getter 可能导致渲染异常










