还有另一个问题问同样的问题,但我无法理解接受的答案。
有问题的库似乎用于Object.defineProperty
添加对要存储的对象的引用(尽管间接通过另一个对象)。
但是......当然这意味着该对象不能因为这个链接而被垃圾收集?
我错过了什么?
是否真的可以创建一个对象并将其存储在某个地方而无需维护垃圾收集器可注意到的引用?(在 ES2015 之前)
接受的答案:
我花了一些时间来摸索代码,但后来它击中了我:键本身用于存储对值的引用。
例如,将其设置为几层
defProp(obj, globalID, { value: store }); 其中 defProp 已定义为 Object.defineProperty,obj 是键,globalID 是 guid,store 是包含值的存储对象。
然后在 get 它查找值
对象[全局ID];
这是非常聪明的。WeakMap 实际上并不包含对任何东西(弱或其他)的引用——它只是设置了一个秘密存储值的策略。使用 Object.defineProperty 意味着您不会意外发现值存储——您必须知道查找它的魔法指南。
由于键直接引用值(而 WeakMap 不引用它),当所有对键的引用都消失时,它会像往常一样进行 GC。