javascript推荐用对象组合替代多重继承,通过object.assign拼装、动态模块加载、委托模式及工厂函数实现高内聚低耦合、易测易维护的对象构建。

JavaScript 本身不支持多重继承,但对象组合(Composition)是比模拟多重继承更自然、更健壮的替代方案。它不依赖原型链扩展,而是让对象“拥有”多个功能模块,通过委托或直接调用复用行为——逻辑清晰、耦合低、易于测试和复用。
用 Object.assign 实现基础能力拼装
这是最直观的方式:把多个行为对象的自有属性一次性合并到新对象上,适合创建无状态或轻量实例。
- 每个行为对象(如 Walker、Talker)只负责单一职责,结构扁平、可独立维护
- Object.assign({}, Walker, Talker, { name: "小明" }) 创建的是一个全新对象,所有方法都挂载在实例自身,**完全绕过原型查找**,访问快且确定
- 注意:仅复制可枚举的自有属性,不处理 getter/setter 或不可枚举方法;若需深度合并,应改用结构化克隆或专用工具
运行时动态组合,支持按需加载与切换
比起在创建时就固定所有能力,更灵活的做法是让对象在生命周期中动态接入/卸载模块。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 定义统一接口,例如每个模块提供 init(instance) 和 destroy() 方法,由主对象协调生命周期
- 使用 WeakMap 存储模块私有状态,避免污染实例属性,也防止内存泄漏
- 示例:一个 UI 组件可先加载 Draggable 模块,用户操作后才注入 Resizable,互不干扰
用委托模式保持原型链干净,同时复用逻辑
不把方法拷贝到实例,而是在实例上保留对功能模块的引用,调用时显式委托过去——既节省内存,又支持共享状态(如计数器、配置缓存)。
- 例如:this.logger.log(...) 而非 this.log(...),语义明确,调试时容易追踪来源
- 模块内部可自由使用 this 指向自身上下文,避免 call(this) 的伪多态陷阱
- 配合 class 语法,可在构造函数中初始化委托关系:this.network = new NetworkClient(config),后续全部走 this.network.xxx
组合 + 工厂函数,封装可复用的对象构建流程
把组合逻辑收进工厂函数或类,对外暴露简洁 API,隐藏内部组装细节。
- 工厂接收配置项,决定启用哪些模块,甚至根据环境返回不同实现(如开发版加调试模块,生产版剔除)
- 返回的对象具备统一接口(如 start()、stop()),但内部由各模块协同完成
- 比混入(Mixin)更可控:不会因顺序错乱导致方法覆盖,也不用担心 instanceof 失效或 super 行为异常
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










