ES6中WeakMap的使用
说WeakMap
之前,首先说说es6中的Map
。
Map
存储的是一个键值对,任何值都可以作为键或者是值才进行存储。所以,在需要保存键值映射关系时,可以使用Map
来完成这些操作。Map
接口上也提供了不少好用的方法,具体可以参见MDN。
在js中,每一个Map
之间,都保留的是一个强引用,就是说,如果不是我们手动触发垃圾回收的话,垃圾回收器是不会自己进行垃圾回收的,例如如下的示例。
const element = document.getElementById("someId")
const map = new Map();
map.set(element, "hello world")
element.remove()
将dom元素与hello world
字符串建立映射关系,但是当页面中的这个element
元素删除时,hello world
这个字符串对象并不会被垃圾回收器进行垃圾回收,依然存在于内存之中,但是,这部分内容有时候我们并不需要了,那么此时就出现了WeakMap
。
所谓WeakMap
,顾名思义,对象键名与值之间建立的是弱引用,当引用不存在时,会被垃圾回收器自动进行垃圾回收。所以当你不能或者不想控制关联数据的生命周期时就可以考虑使用WeakMap
。
要注意一点,WeakMap
的键只能是一个对象。而且WeakMap
是不可以遍历的,它只有四个方法可用:get()
、set()
、has()
、delete()
。参见MDN。
例如,使用WeakMap
来保存自定义的data
对象属性,仍然是上面的示例,不过,使用的是WeakMap
。还可以使用WeakMap
来建立对象的私有属性。
const privateData = new WeakMap();
class Person {
constructor (name, age) {
privateData.set(this, { name, age })
}
getName () {
return privateData.get(this).name
}
getAge () {
return privateData.get(this).age
}
}
export default Person
如果您觉得本文对您有用,欢迎捐赠或留言~
- 本博客所有文章除特别声明外,均可转载和分享,转载请注明出处!
- 本文地址:https://www.leevii.com/?p=1265