WeakMap 是模块化插件开发中隔离私有状态的首选工具——它通过弱引用键绑定插件实例与私有数据,实现天然隔离、不可枚举、模块隐藏及自动内存清理。

WeakMap 是模块化插件开发中隔离私有状态的首选工具——它让每个插件实例拥有专属、不可见、自动清理的配置与状态,且不污染实例本身,也不干扰其他模块。
用 WeakMap 绑定插件实例与私有数据
在插件模块顶层声明一个 WeakMap,所有该模块内的插件类共享它:
- 键必须是插件实例(this),确保不同实例间数据天然隔离
- 值是一个普通对象,存放 token、开关、缓存策略等敏感或临时字段
- 不能传字符串 ID 或数字,否则会报错;也不能在构造函数里重复 new WeakMap,否则失去弱引用意义
确保私有状态对外绝对不可见
WeakMap 的设计决定了它不会暴露任何内部信息:
- 没有 keys()、values()、entries() 方法,无法遍历或枚举所有插件的状态
- 插件实例即使被 console.dir() 查看,也看不到 WeakMap 中的内容
- 私有字段不会出现在 this 上,比如 plugin._token 是 undefined
- 只有插件自己的原型方法(如 plugin.getToken())能通过 privateStore.get(this) 安全读取
配合模块作用域隐藏 WeakMap 引用
WeakMap 本身不提供封装能力,必须靠闭包或模块作用域保护:
立即学习“Java免费学习笔记(深入)”;
- 把 const privateStore = new WeakMap() 写在模块最外层,不导出
- 所有插件类都闭包访问这个变量,外部代码拿不到引用,也无法篡改
- 可额外封装统一的访问函数(如 getPrivate(plugin)、setPrivate(plugin, data)),加入校验或日志逻辑
利用弱引用实现插件卸载时自动清理
这是 WeakMap 在插件系统中最关键的优势:
- 当插件实例被框架卸载、用户调用 dispose() 或 DOM 节点被移除,只要没有其他强引用,GC 就会自动回收该实例及对应的 WeakMap 条目
- 不需要监听 destroy 事件,也不用手动 delete,彻底避免内存泄漏
- 注意:私有数据对象内部不要反向强引用插件实例(如 { owner: this }),否则会阻碍回收


















