JavaScript WeakMap对象的用途
什么是WeakMap
WeakMap是一种由键值对组成的集合,其中键是对象,值是任何JavaScript对象。
它类似于 Map ,但有一些区别:
- 它不可枚举,键是私有的。
- 如果键在WeakMap之外的地方没有引用到,它允许任何值进行垃圾回收。
- 只有对象可以作为键。
- 它依赖于垃圾回收,引入了不确定性。
注意: 键不能是原始数据类型(例如,字符串不能作为WeakMap的键)。
语法:
new WeakMap([iterable])
实例方法: 共有4个实例方法。
- WeakMap.prototype.delete( key ) : 删除具有给定键的任何值。
- WeakMap.prototype.get( key ) : 返回具有给定键的值,否则返回undefined。
- WeakMap.prototype.has( key ) : 返回一个布尔值,判断一个值是否为WeakMap对象。
- WeakMap.prototype.set( key, value ) : 在WeakMap对象中设置给定键的值。
WeakMap的应用场景:
- 可用于跟踪对象调用。
- 可用于跟踪库。
- 可用作类中的私有属性。
- 在浏览器中存储关于宿主对象(如DOM节点)的数据。
注意: 使用node.js执行以下示例
步骤:
- 安装node.js
- 在命令行中执行node <filename.js>
示例1: 这是一个WeakMap的基本用例,我们将一个空对象作为WeakMap的键引用,当赋值为“null”时,该对象会被垃圾回收,WeakMap也会自动设置为“undefined”。
JavaScript
const wm = new WeakMap();
let obj = {};
wm.set(obj, "value");
console.log(wm.get(obj));
obj = null;
console.log(wm.get(obj));
输出:
value
undefined
示例2: 在这个示例中,你将理解如何使用WeakMap追踪对象。你可以统计对象被传递给函数 foo() 的次数。
JavaScript
const objTracker = (() => {
const wm = new WeakMap();
return (obj) => {
wm.set(obj, (wm.get(obj) || 0) + 1);
return wm.get(obj);
}
})();
function foo(args) {
const count = objTracker(args);
console.log(`{JSON.stringify(args)} is called{count} times`)
}
const obj1 = { key: 1 }
const obj2 = { key: 2 }
foo(obj1);
foo(obj1);
foo(obj2);
输出:
{"key":1} is called 1 times
{"key":1} is called 2 times
{"key":2} is called 1 times
示例3: 在这个示例中,我们在类中创建了私有属性。这类似于使用私有属性并在前面加上 #。
JavaScript
const Foo = (() => {
const wm = new WeakMap();
return class Fooclass {
constructor() {
wm.set(this, {
classname: 'Fooclass'
});
}
get name() {
return wm.get(this).classname;
}
}
})();
const obj1 = new Foo()
console.log(obj1.name)
输出结果:
Fooclass
示例4: 在这个示例中,你将会了解如何通过对库方法进行特殊处理,在调用它们时做一些特殊的事情。直到 mod() 函数存在之前,你可以做一些操作。
JavaScript
function mod(a, b) {
return a % b;
}
const lib = new WeakMap();
lib.set(mod, {
do: () => {
console.log('Something done');
}
})
lib.get(mod).do();
输出:
Something done
极客教程