weakmap 适合做私有存储因其键为弱引用对象,实例销毁时自动回收,避免内存泄漏;不可遍历、无枚举方法,保障封装性;且天然支持以实例为键存储私有数据与方法。

WeakMap 是 JavaScript 中实现真正私有属性和方法的推荐方式,它能避免内存泄漏,同时让属性无法被外部直接访问。
为什么 WeakMap 适合做私有存储
WeakMap 的键必须是对象,且对键的引用是“弱引用”——当实例对象被销毁时,WeakMap 中对应的条目会自动被垃圾回收。这解决了传统闭包或 Symbol 方案中可能存在的内存泄漏或可枚举/可反射问题。
WeakMap 本身不可遍历,也没有 keys()、values() 等方法,外部无法探测其中内容,天然具备封装性。
用 WeakMap 实现私有属性
核心思路:把类实例作为 WeakMap 的键,把私有数据(如对象)作为值存进去。
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 在类外部定义一个
const privateData = new WeakMap() - 在构造函数中调用
privateData.set(this, { count: 0, name: 'default' }) - 所有实例方法通过
privateData.get(this)访问私有字段
示例:
const privateData = new WeakMap();
class Counter {
constructor(initial = 0) {
privateData.set(this, { count: initial });
}
increment() {
const data = privateData.get(this);
data.count++;
}
getCount() {
return privateData.get(this).count;
}
}
用 WeakMap 实现私有方法
私有方法本质是私有作用域内的函数,可通过闭包 + WeakMap 存储绑定到实例的函数引用实现。
- 在类外定义私有函数(不暴露给实例)
- 将该函数绑定到当前实例,并存入 WeakMap(如
privateMethods.set(this, { log: log.bind(this) })) - 公有方法中调用
privateMethods.get(this).log()
更简洁的做法是:直接把私有逻辑写在闭包内,仅通过 WeakMap 存储状态,方法体仍写在类中 —— 因为方法体本身不暴露数据,真正需要隐藏的是数据而非函数代码。
注意事项与限制
- WeakMap 不能用原始值(如字符串、数字)作键,只能用对象(包括 class 实例)
- 无法在子类中直接访问父类的 WeakMap 私有数据,需显式传递或设计共享 WeakMap
- 调试时看不到 WeakMap 中的内容,需靠
console.log(privateData.get(instance))辅助排查 - 不适用于需要序列化(JSON.stringify)的场景,因为私有字段不会被包含
这种模式已被广泛用于现代库(如 Lit、SolidJS 内部)管理私有状态,兼顾安全性与性能。










