javascript函数式编程弱化继承,主张用组合替代继承、数据流替代状态传递、纯函数替代方法复用,通过高阶函数、不可变数据、柯里化和adt实现更轻量可控的复用。

JavaScript 中继承机制在函数式编程思想下,并不追求“替代继承”,而是通过改变代码组织逻辑,自然弱化对类层级、多层继承、重写与 super 调用等复杂架构的依赖。核心思路是:**用组合代替继承,用数据流代替状态传递,用纯函数封装行为代替方法复用**。
用高阶函数和组合替代子类扩展
传统面向对象中,子类常用于扩展父类行为(如重写 render、validate)。函数式做法是把行为抽象为可组合的函数:
- 将校验逻辑拆成独立纯函数:
isEmail、isRequired、maxLength(50) - 用函数组合(如
pipe或compose)动态拼装验证链,而非定义EmailValidator extends BaseValidator - 每个函数职责单一、无 this、不依赖实例状态,复用时直接导入调用,无需构造继承树
用不可变数据 + 纯函数处理“状态变化”
继承常被用来共享和派生状态(如子类修改父类的 this.data)。函数式方案则彻底回避可变实例状态:
- 把“用户配置”视为输入参数,而不是
class UserConfig extends DefaultConfig - 用
updateConfig(base, patch)返回新配置对象,而不是this.config = {...this.config, ...patch} - 所有操作不修改原对象,也就不需要靠继承来隔离或覆盖字段——差异由参数决定,而非类关系决定
用柯里化和闭包封装上下文,替代 this 绑定与原型查找
ES6 class 中的 this 和原型链本质是为隐式传递上下文服务。函数式可用显式方式更可靠地达成同样目标:
- 用
createApiClient(baseUrl)返回一组绑定好 base URL 的函数(get、post),无需class ApiClient extends BaseClient - 用
withAuth(token)(fetch)包裹原始 fetch,注入认证头——行为增强靠函数包装,不靠继承链 - 避免了
super.method()调用顺序问题、this绑定丢失、原型污染等继承常见陷阱
用代数数据类型(ADT)和模式匹配替代多态分支
继承常被用于实现运行时多态(如 Shape.draw() 在 Circle/Triangle 中不同实现)。函数式倾向用数据+函数分离的方式:
- 定义统一数据结构:
{ type: 'circle', radius: 5 }或{ type: 'rect', width: 10, height: 4 } - 用
draw(shape)函数内部用switch (shape.type)或更函数式的match工具分发逻辑 - 新增形状只需添加 case 分支或新 handler,不需新建类、不修改原有继承体系
本质上,函数式编程不是废除继承,而是让“复用”回归到更轻量、更可控的粒度:函数即单元,组合即架构,数据即契约。当业务逻辑不再耦合在 this 和原型链中,继承就从“必须搭建的骨架”变成了“可选的语法糖”。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











