weakmap.prototype.get 用于根据对象键安全获取关联值,支持私有数据存储;其键为弱引用对象,不阻止垃圾回收,配合闭包作用域实现真正私有性,且无法遍历或枚举。

WeakMap.prototype.get 用于从 WeakMap 实例中根据键(必须是对象)获取对应的值,常被用来安全地存储和访问对象的私有数据。
WeakMap 存储私有数据的核心逻辑
WeakMap 的键只能是对象,且对键对象是弱引用——不会阻止垃圾回收。这使得它非常适合绑定私有状态:只要对象存在,就能通过 get 拿到关联数据;对象被销毁后,对应条目自动消失,无需手动清理。
注意:get 方法本身不提供“私有性”保障,真正的私有性来自 WeakMap 实例的作用域封闭(通常定义在模块或闭包内),外部无法直接访问该 WeakMap。
典型用法:为类实例添加私有字段
以下是一个常见模式:在构造函数外定义私有 WeakMap,内部用 get 和 set 管理每个实例的专属数据。
- 定义一个模块级(或闭包内)的 WeakMap 变量,比如
const privateData = new WeakMap() - 在构造函数中调用
privateData.set(this, { secret: value })初始化私有状态 - 在方法中通过
privateData.get(this)获取该实例的私有数据对象 - 如果
get返回undefined,说明该对象未被初始化过,可做兜底处理
使用 get 时的注意事项
get 方法只接受一个参数(键),返回对应值或 undefined。它不会抛错,即使键从未调用过 set。
- 必须确保传入的是原始对象引用(不能是新创建的对象,哪怕属性相同)
- 不能用字符串、数字、Symbol 或 null 作为键,否则会报
TypeError - 若想检查是否存在,不要用
== null判断,因为值本身可能是null或undefined;建议用has()先判断 - WeakMap 不支持遍历,也无法获取所有键或值,这是设计使然,也是私有性的保障之一
简单示例代码
const _privates = new WeakMap();
class User {
constructor(name) {
this.name = name;
_privates.set(this, { token: Math.random().toString(36).slice(2, 10) });
}
getToken() {
return _privates.get(this)?.token;
}
}
调用 new User('Alice').getToken() 就能安全读取仅属于该实例的 token,外部无法通过任何方式访问 _privates 或枚举其内容。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











