原型链插件系统通过共享prototype实现“挂得上、调得到、不冲突”,利用钩子机制(如beforeinit)、统一use注册入口及配置合并策略,兼顾扩展性与兼容性。

用原型链实现插件系统,核心是让插件“挂得上、调得到、不冲突”。它不依赖框架或复杂机制,而是利用 JavaScript 原型的天然共享特性,把扩展逻辑安全地注入到实例行为中。
把基础能力放在 prototype 上
构造函数的 prototype 是所有实例共享的“方法仓库”,适合放初始化、销毁、配置合并等通用逻辑。插件只需往这个原型上添加或覆盖方法,就能被所有后续实例自动继承。
- 避免在每个实例中重复创建函数,节省内存
- 调用 this.init() 时自动沿原型链查找,无需手动 bind
- 升级主库时,只要方法签名不变(比如 init 接收 config 对象),老插件仍可运行
预留语义清晰的钩子点
光有方法还不够——插件需要知道“什么时候能插手”。在关键流程节点主动触发命名明确的钩子,比如 beforeInit、afterRender、onDataUpdate。
- 插件通过 on('beforeInit', handler) 注册响应逻辑,而不是直接改原型方法
- 钩子名统一小写+下划线(如 before_init)或驼峰(beforeInit),文档公开且不随意变动
- 主库内部在对应位置调用 this._triggerHook('beforeInit', args),确保时机可控
提供统一的插件注册入口
不鼓励插件直接操作 prototype,而是通过 use(plugin) 方法集中接入。这个方法负责校验、执行和生命周期协调。
- plugin 可以是对象(含 install 方法)、函数(接收 instance 和 options)或类
- use 内部调用 plugin.install(this, options),保证插件在 init 前完成注册
- 支持链式调用:new Lib().use(logPlugin).use(authPlugin).init()
配置合并与类型安全要透明
插件常需调整行为,但不能让用户反复传一堆参数。主库应定义清晰的配置约定,并做基础校验。
- 统一前缀,比如 enableLog、onError、defaultTimeout
- 对布尔值、数字类配置做默认 fallback(如 timeout: Number(config.timeout) || 5000)
- 关键配置项做简单类型检查,错配时 warn 而非静默失败
不复杂但容易忽略。











