1
0
mirror of https://github.com/ruanyf/es6tutorial.git synced 2025-05-24 18:32:22 +00:00

修改weakmap

This commit is contained in:
Ruan Yifeng 2015-02-15 23:50:29 +08:00
parent 4c9b971e57
commit 1f7cb6cf7a

View File

@ -644,18 +644,16 @@ var wm = new WeakMap();
var element = document.querySelector(".element");
wm.set(element, "Original");
var value = wm.get(element);
console.log(value); // "Original"
wm.get(element) // "Original"
element.parentNode.removeChild(element);
element = null;
value = wm.get(element);
console.log(value); // undefined
wm.get(element) // undefined
```
上面代码中变量wm是一个WeakMap实例我们将一个DOM节点element作为键名然后销毁这个节点element对应的键就自动消失了再引用这个键名就返回undefined。
WeakMap与Map在API上的区别主要是两个一是没有遍历操作即没有key()、values()和entries()方法也没有size属性二是无法清空即不支持clear方法。这与WeakMap的键不被计入引用、被垃圾回收机制忽略有关。因此WeakMap只有四个方法可用get()、set()、has()、delete()。
```javascript
@ -670,7 +668,26 @@ wm.forEach
```
WeakMap的一个用处是部署私有属性。
前文说过WeakMap应用的典型场合就是DOM节点作为键名。下面是一个例子。
```javascript
let myElement = document.getElementById('logo');
let myWeakmap = new WeakMap();
myWeakmap.set(myElement, {timesClicked: 0});
myElement.addEventListener('click', function() {
let logoData = myWeakmap.get(myElement);
logoData.timesClicked++;
myWeakmap.set(myElement, logoData);
}, false);
```
上面代码中myElement是一个DOM节点每当发生click事件就更新一下状态。我们将这个状态作为键值放在WeakMap里对应的键名就是myElement。一旦这个DOM节点删除该状态就会自动消失不存在内存泄漏风险。
WeakMap的另一个用处是部署私有属性。
```javascript