javascript 中 class 封装的核心是通过 # 私有字段、getter/setter 受控访问和职责分离实现真正可维护的封装结构。# 字段确保内部状态不可见,getter/setter 控制属性访问逻辑,静态私有方法隔离工具逻辑,组合优于继承以明确单一职责。

JavaScript 中通过 class 实现对象封装,核心不是语法糖本身,而是借助它组织私有状态、限制外部直接访问、明确接口契约。ES6 的 class 本身不提供真正的私有字段(直到 # 语法),但结合现代特性可以构建出逻辑清晰、职责分明的封装结构。
用 # 私有字段明确内部状态边界
ES2022 引入的私有字段(#name)是封装的第一道防线:它们无法被类外部读写,连 in 操作符和 Object.keys() 都不可见。
示例:
class BankAccount {
#balance = 0;
#accountNumber;
<p>constructor(number) {
this.#accountNumber = number;
}</p><p>deposit(amount) {
if (amount > 0) this.#balance += amount;
}</p><p>getBalance() {
return this.#balance; // 只能通过方法暴露
}
}</p>
这样,#balance 和 #accountNumber 真正属于实例内部,外部无法意外篡改,也不污染公共属性列表。
用 getter/setter 控制属性访问逻辑
对需要校验、计算或副作用的属性,避免直接暴露字段,改用 get / set 定义受控接口:
-
只读属性:只定义
get,如get id() { return this.#id; } -
带校验的写入:在
set name(value)中检查空值、长度、格式等 -
派生属性:如
get fullName() { return `${this.#firstName} ${this.#lastName}`; },不占用存储空间
用静态私有方法隔离工具逻辑
类内部重复使用的辅助逻辑(如格式化、校验、API 请求封装),适合定义为静态私有方法(static #validateEmail(email))。它们不依赖实例状态,又不暴露给外部,保持类内聚性高、接口干净。
注意:静态私有方法只能被同一类中的其他方法调用,不能被子类继承或访问——这反而强化了封装意图。
组合优于继承,用 class 封装单一职责
避免让一个 class 承担过多角色(如既管数据、又管渲染、还管网络)。更清晰的做法是:
- 用一个 class 封装领域模型(如
User,含验证、状态转换) - 另用一个 class 封装数据获取(如
UserAPI,专注请求和错误处理) - 通过依赖注入或工厂函数组装,而非继承扩展
这样每个 class 的 public API 很小,测试、复用和维护都更简单。
不复杂但容易忽略:class 封装的价值不在“看起来像面向对象”,而在于用语言机制把谁该知道什么、谁该修改什么、变更影响范围划清楚。# 字段 + 受控访问器 + 职责分离,三者配合才能让代码真正可维护。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











