javascript插件扩展采用原型链实现轻量复用:构造函数仅初始化实例独有数据,通用方法挂载prototype避免冗余;通过可替换属性(如handler)动态委托插件逻辑,支持热加载;用object.create派生配置化变体;weakmap管理私有状态防泄漏。

JavaScript 通过原型链实现轻量级插件扩展,核心是“委托优于继承、共享优于复制”——把通用能力挂到原型上供所有实例复用,插件逻辑则通过动态委托、可替换引用或运行时注入来切换,不污染原型、不重建实例、不阻塞 GC。
用 prototype 托管基础行为,构造函数只管状态
构造函数专注初始化实例独有数据(如 this.id、this.config),所有可复用的方法统一写在 prototype 上。这样每次 new 不会重复创建函数对象,内存开销极小。
- 例如定义一个基础插件容器:
function PluginHost(options) {
this.options = { ...defaultOptions, ...options };
this.enabled = true;
}
PluginHost.prototype.enable = function() { this.enabled = true; };
PluginHost.prototype.disable = function() { this.enabled = false; };
PluginHost.prototype.exec = function(action, data) {
if (!this.enabled) return;
return this.handleAction ? this.handleAction(action, data) : null;
};
- handleAction 是预留的可变钩子,不写死逻辑,留给插件动态赋值
- 所有实例共享同一份 enable/disable/exec 方法,无冗余函数对象
插件通过可替换方法引用实现热加载
不把插件逻辑硬编码进 prototype,而是让原型方法委托给一个可被外部修改的属性(如 this.handler 或 this.plugins)。插件加载时直接赋值,运行时自动生效。
- 实例初始化时设置默认处理逻辑:
this.handler = this.defaultHandler.bind(this); - 插件模块导出一个处理器函数:
export const jsonValidator = (data) => JSON.parse(data); - 应用侧动态切换:
host.handler = jsonValidator; - 后续调用 host.exec('parse', str) 就自动走新逻辑,无需改原型、不重建实例
用 Object.create 做配置化派生,避免类爆炸
当需要多个行为一致但参数不同的插件变体(比如不同超时、不同重试次数),不用定义一堆子类,改用原型委托创建轻量对象。
- 定义基模:
const basePlugin = { timeout: 3000, retry: 2, run() { /* 通用执行流程 */ } }; - 按需派生:
const fastPlugin = Object.create(basePlugin);
fastPlugin.timeout = 500;
fastPlugin.retry = 0; - 调用 fastPlugin.run() 时自动沿原型链找到 basePlugin.run,只覆盖差异字段
- 适合高频创建/销毁场景,比如每帧更新的状态管理器或表单校验器
配合 WeakMap 管理插件私有状态,防内存泄漏
原型上的方法本身不保存上下文,运行时传入临时数据;真正需要持久化的插件状态(如 token、缓存 map、上次执行时间)用 WeakMap 关联到实例,确保实例被回收时状态自动释放。
- const pluginState = new WeakMap();
pluginState.set(host, { lastRun: Date.now(), cache: new Map() }); - 在 exec 中通过 pluginState.get(this) 获取当前状态,安全且无引用滞留
- 比闭包捕获 this 或挂载到实例属性更可控,尤其适合长期运行的插件系统
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











