WeakMap 是插件系统管理私有配置数据的理想工具——它让每个插件实例拥有专属配置,不暴露给外部,且支持自动垃圾回收;配置通过插件实例作键存入模块顶层 WeakMap,不可枚举、不可遍历,仅原型方法可安全访问,销毁实例时条目自动清理。

WeakMap 是插件系统里管理私有配置数据的理想工具——它让每个插件实例拥有专属配置,又不暴露给外部,还不会拖慢垃圾回收。
用 WeakMap 绑定插件实例与配置
把 WeakMap 声明在模块顶层,所有插件共享同一张表。构造函数中用 this(即插件实例)作键,存入配置对象:
- 配置对象可包含 token、开关状态、缓存策略等敏感或临时字段
- 键必须是对象,所以不能传字符串 ID 或数字 ID,只能是插件实例本身
- 避免在每次初始化时新建 WeakMap,否则失去弱引用和复用优势
确保配置真正私有且不可遍历
WeakMap 本身不可枚举,没有 keys()、values() 或 forEach 方法,外部代码既不能遍历所有插件配置,也无法通过反射拿到 privateStore 变量:
- 即使插件实例被 console.dir 或调试器查看,也看不到 WeakMap 中的值
- 配置字段不会出现在 this 上,调用 plugin.token 会是 undefined
- 只有插件自己的原型方法(如 plugin.getToken())能通过 privateStore.get(this) 安全读取
配合插件生命周期自动清理
当插件实例被销毁(比如框架卸载组件、用户主动 dispose),只要没有其他变量强引用该实例,WeakMap 中对应条目就会随垃圾回收自动消失:
立即学习“Java免费学习笔记(深入)”;
- 不用手动 delete,也不用监听 destroy 事件去清理
- 特别适合动态加载/卸载的插件场景,比如富文本编辑器的 toolbar 插件、图表库的交互插件
- 若配置里意外保存了对插件实例的强引用(例如 { owner: this }),会阻碍回收——要避免这种反向引用
典型结构示例
一个轻量插件类写法:
const pluginConfig = new WeakMap();
class ToolbarPlugin {
constructor(options = {}) {
this.element = options.el;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
pluginConfig.set(this, {
enabled: true,
iconSize: options.size || 16,
_apiKey: options.key || '' // 不希望被访问的字段
});
}
isEnabled() { return pluginConfig.get(this).enabled; }
setIconSize(size) { pluginConfig.get(this).iconSize = size; }
}

















