面向对象重构JavaScript的核心是分治+封装+职责归位,即识别实体、行为与规则并建模为边界清晰的类,通过绞杀者模式逐步替换、用组合与原型优化结构。

直接用面向对象思想重构庞大的过程式 JavaScript 代码,核心不是“重写”,而是“分治+封装+职责归位”。关键在于识别出隐藏在流程里的实体、行为和规则,把它们提炼成有明确边界和责任的对象。
识别可建模的实体与职责
过程式代码往往是一长串 if-else、for 循环和函数调用。先通读逻辑,问自己三个问题:
- 哪些数据是成组出现、经常一起被操作的?(比如用户信息、订单项、测试参数组)→ 这些就是潜在的类
- 哪些逻辑反复出现、判断条件复杂但目的单一?(比如解析参数范围 A:C、判断是否在夏季、校验输入格式)→ 这些适合抽成独立方法或工具类
- 哪些步骤总是按固定顺序执行,且每步依赖前一步结果?(比如“打开连接→发送请求→解析响应→更新UI”)→ 这些可封装为服务类或流程控制器
例如原文中解析 paramGroupName 的那段逻辑(逗号分隔、冒号范围、单值),它不依赖外部状态、只做一件事,就该剥离为 ParamFilterParser 类或静态工具方法,而不是散落在 _run 里。
用构造函数 + 原型定义清晰的类结构
避免把所有东西塞进一个构造函数。按高内聚低耦合原则拆分:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
领域模型类:如
TestCase、TestParamGroup,负责自身数据验证、状态转换(例:tpg.matches(filter)) -
策略类:如
RangeMatcher、ListMatcher,封装不同匹配逻辑,未来加新格式(如正则匹配)只需新增类,不改主流程 -
协调器类:如
TestRunner,只负责调度——获取配置、创建匹配器、遍历用例、调用执行——不再操心“怎么解析”“怎么比较”
这样,原 _run 方法会大幅瘦身,变成可读性强的声明式流程:
const parser = new ParamFilterParser(paramGroupName);<br> const matcher = parser.toMatcher();<br> testCase.getParams().filter(matcher.matches).forEach(tpg => this.executeOne(tpg));
逐步替换,保留行为一致性
重构不是推倒重来。推荐“绞杀者模式”(Strangler Pattern):
- 先写新类,覆盖原有某一块逻辑(如参数解析),并用单元测试验证输出完全一致
- 在旧函数中,用新类替代对应片段,其余逻辑暂时不动
- 逐块替换,每次提交都确保所有测试通过
- 最后删除冗余的过程式分支,只留下干净的面向对象调用链
这样做风险可控,团队也能同步适应新结构,不会因一次大改引发回归问题。
善用原型共享与组合代替继承
JavaScript 不强调传统继承。优先考虑:
- 把通用方法(如
toString()、isValid())挂到构造函数的prototype上,节省内存 - 用组合代替深层继承:比如
TestRunner持有Notifier和Engine实例,而不是继承它们 - 对行为差异大的场景,用对象字面量或 Map 存储策略,比 if-else 列表更易扩展(例:
const matchers = { list: ListMatcher, range: RangeMatcher };)
不复杂但容易忽略

















