It took me a while to grok the code, but then it hit me: the key itself is used to store a reference to the value.
For example, several layers into set
it does
defProp(obj, globalID, { value: store });
where defProp
has been defined to be Object.defineProperty
, obj
is the key, globalID
is a guid and store
is a storage object that contains the value.
Then down in get
it looks up the value with
obj[globalID];
This is very clever. The WeakMap doesn't actually contain a reference to anything (weak or otherwise)-- it just sets up a policy of where to secretly store the value. The use of Object.defineProperty
means that you won't accidentally discover the value storage-- you have to know the magic guid to look it up.
Since the key directly refers to the value (and the WeakMap doesn't refer to it), when all references to the key are gone, it gets GCed like normal.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…