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
如果您觉得本文对您有用,欢迎捐赠或留言~
微信支付
支付宝

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注