面向对象重构JavaScript的核心是将“做什么”转为“谁来做”,通过识别User、Cart等业务实体,封装数据与行为为职责单一的对象,利用组合而非继承,并逐步迁移高变动模块。

用面向对象思想重构 JavaScript 中的面向过程代码,核心是把“做什么”变成“谁来做”,把零散的函数和数据,组织成有职责、有状态、有行为的对象。不是硬套 class,而是围绕业务实体建模,让代码更易理解、复用和维护。
识别可封装的业务实体
先通读过程式代码,找出反复出现的数据结构和相关操作。比如一段处理用户登录的代码里,频繁出现 username、password、token、login()、logout()、isValid() —— 这些就天然构成一个 User 实体。
- 把关联的数据(属性)收进对象内部,避免全局变量或到处传参
- 把作用于这些数据的逻辑(方法)绑定到对象上,形成“数据+行为”的统一单元
- 常见候选实体:User、Product、Cart、ApiService、FormValidator、Timer 等
用类或构造函数定义对象结构
ES6 的 class 是最直观的方式,但本质仍是基于原型的构造函数。重点是明确职责边界,而非语法炫技。
// 过程式写法(分散、难复用)
let currentUser = null;
function login(u, p) { /* ... */ }
function logout() { /* ... */ }
function getToken() { return currentUser?.token; }
<p>// 面向对象重构后
class User {
constructor(username, password) {
this.username = username;
this.password = password;
this.token = null;
}</p><p>login() {
// 模拟请求,设置 token
this.token = 'abc123';
return this.token;
}</p><p>logout() {
this.token = null;
}</p><p>isValid() {
return !!this.token;
}
}这样每个用户实例都自带状态和能力,多个用户互不干扰,测试也更容易(比如 new User('a','123').login())。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
提取通用行为为独立类,避免大而全的对象
不要把所有功能堆进一个类。比如表单校验逻辑,和用户本身无关,更适合抽成 FormValidator;HTTP 请求细节,适合封装为 ApiService。
- 一个类只负责一件事:User 管身份,Cart 管商品列表,Validator 管规则,ApiService 管通信
- 通过组合(composition)而非继承来复用:User 内部可以持有 ApiService 实例,而不是继承它
- 例如:
class User { constructor(api) { this.api = api; } login() { return this.api.post('/login', ...); } }
逐步迁移,优先封装高变动/高复用模块
不必一次性重写全部。从痛点入手:
- 经常改的逻辑(如价格计算规则、权限判断)→ 提炼为
PricingStrategy或PermissionChecker - 多处调用的工具逻辑(如日期格式化、深克隆)→ 封装为
DateUtils、CloneHelper,作为工具类或静态方法 - 带状态的交互流程(如多步表单、游戏状态机)→ 用类管理整个生命周期,比一堆 flag 变量清晰得多
重构后,原来几十行的过程式函数,可能变成几行对象调用:const cart = new Cart(); cart.addItem(product); cart.calculateTotal(); —— 语义清晰,意图一目了然。

















