通用原型继承适配器通过显式委托+原型链实现,而非自动继承;先定义目标接口类建立原型骨架,再让适配器继承其原型,构造器注入被适配对象,所有方法均委托调用并支持参数转换与多类型适配。

通用的原型继承适配器不是靠“自动继承所有方法”实现的,而是通过显式委托 + 原型链辅助类型兼容与方法复用。核心在于:让适配器实例能通过 instanceof 检查、拥有目标接口的原型结构,但实际逻辑全部交由被适配对象执行。
明确目标接口并定义基类原型
先声明一个空的目标类(或函数),它只提供方法签名占位,不包含具体实现。这一步建立原型链骨架,便于后续 instanceof 判断和统一方法挂载:
- 用
class Target { method() {} }或function Target() {}定义目标接口 - 确保所有适配器都以它为原型起点,比如
Adapter.prototype = Object.create(Target.prototype) - 手动设置
Adapter.prototype.constructor = Adapter,避免 constructor 指向错误
在构造器中注入被适配对象
适配器本身不保存业务逻辑,只持有一个待适配的实例(Adaptee),并在方法中调用它:
- 构造函数接收 Adaptee 实例,如
constructor(adaptee) { this.adaptee = adaptee; } - 不调用
super()(除非目标类有必需初始化逻辑) - 避免在构造器里复制或重写 Adaptee 的方法——委托才是关键
按需实现目标方法,全部委托给被适配对象
每个目标接口方法都应映射到 Adaptee 的对应行为,支持参数转换、格式包装等适配逻辑:
- 例如目标要求
fetch(url),而 Adaptee 只有request(options),就在适配器里做转换:fetch(url) { return this.adaptee.request({ url }); } - 若多个适配器共用相同转换规则(如统一加前缀、日志包裹),可提取到共享原型方法中,再由各适配器调用
- 不要直接修改 Adaptee 原型;如有必要扩展行为,应在委托链中处理,而非污染源对象
支持多类型适配的灵活构造方式
一个通用适配器可接受不同结构的 Adaptee,只要它们提供约定的底层能力:
- 用判断逻辑区分 Adaptee 类型,比如
if (adaptee.hasMethod('send')) { ... } else if (adaptee.emit) { ... } - 配合 Symbol 或私有字段标记适配能力,避免过度依赖字符串方法名
- 导出工厂函数而非固定类,如
createAdapter(adaptee, config),更易复用和测试











