mirror of
https://github.com/ruanyf/es6tutorial.git
synced 2025-05-24 18:32:22 +00:00
修改weakmap
This commit is contained in:
parent
4c9b971e57
commit
1f7cb6cf7a
@ -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
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user