EcmaScript5中的WeakMap实现?

pal*_*ogt 22 javascript ecmascript-5 ecmascript-6

我遇到了一个在ES5中实现跨浏览器WeakMapJavaScript库.(WeakMap定于ES6.)

如果没有JavaScript语言本身的支持,这怎么可能工作?

编辑:为了清楚,我指的是地图,而不是常规地图.我使用Chrome的分析器测试了这个项目,并且密钥不是由强引用来保存的.他们得到GC'ed而不必从WeakMap中删除它们.

pal*_*ogt 34

我花了一段时间来修改代码,但后来它击中了我:密钥本身用于存储对值的引用.

例如,set它有几个层

defProp(obj, globalID, { value: store });
Run Code Online (Sandbox Code Playgroud)

其中defProp已被定义为Object.defineProperty,obj是关键,globalID是一个GUID和store是包含值的存储对象.

然后在get它中查找值

obj[globalID];

这非常聪明.WeakMap实际上并不包含对任何内容的引用(弱或其他) - 它只是建立了一个秘密存储值的策略.使用Object.defineProperty意味着你不会意外地发现价值存储 - 你必须知道查找它的魔法指南.

由于键直接引用了值(并且WeakMap没有引用它),当对键的所有引用都消失时,它会像正常一样获得GCed.

  • 它只重新定义`getOwnPropertyNames`以便启动WeakMap.它没有破坏任何东西,并且`getOwnPropertyNames`'功能保持不变.环境完全向后兼容ES5,完全向前兼容ES6 WeakMaps.这是一个非常棒的主意.我在[Secrets](http://github.com/Nathan-Wall/Secrets)中使用了相同的效果. (6认同)
  • 垫片不提供WeakMap的主要属性之一:该值保持较弱.此填充程序在键和值之间创建了一个强引用...类似于将值设置为键对象上的属性. (4认同)
  • 我想知道同样的事情; lib太糟糕了,因为它实际上是不可读的.必须有一个更简单的解释...... (2认同)