前言
随着前端技术的发展,ES6作为一种新的规范,已经成为前端开发者必须学习的内容之一。其中,WeakMap和WeakSet 对象是ES6新增的两种对象类型,本文将详细介绍这两种对象的特点、用法和实际应用,希望能对大家有所帮助。
ES6 引入的 WeakMap 对象
1. 基本概念
WeakMap与Map的 API 类似,但有一些区别。首先,WeakMap 的 key 值只接受对象,不接受原始类型的值(例如字符串、数字、布尔等)。其次,WeakMap中的对象是弱引用,这意味着当对象的引用被删除时,该对象也会自动从WeakMap中移除。
2. 特点
- key只支持对象类型,不支持原始类型。
- 对象为弱引用,当引用被删除时,该对象也会自动从WeakMap中移除。
- WeakMap没有iterable(可迭代的)方法,因此不能被循环迭代。
3. 用法
WeakMap对象可以用于存储和访问对象的私有变量和私有方法。在代码实现中,我们可以通过闭包的形式,将对象的私有属性和方法存储在WeakMap中。这样就可以保护这些私有属性和方法,防止被外部访问。下面是一段示例代码:
const privateData = new WeakMap(); class MyClass { constructor() { privateData.set(this, { privateProperty: "private", privateMethod() { console.log('this is private method'); }, }); } getPrivateProperty() { return privateData.get(this).privateProperty; } setPrivateProperty(value) { privateData.get(this).privateProperty = value; } callPrivateMethod() { privateData.get(this).privateMethod(); } } let obj = new MyClass(); console.log(obj.getPrivateProperty()); // 输出: private obj.setPrivateProperty('new private'); console.log(obj.getPrivateProperty()); // 输出: new private obj.callPrivateMethod(); // 输出: this is private method
在这段代码中,我们使用WeakMap对象的set()和get()方法来存储和获取对象的私有属性和方法。
ES6 引入的 WeakSet 对象
1. 基本概念
WeakSet是一种集合,只能存放对象,并且是弱引用。与WeakMap的不同之处在于,WeakSet中没有重复元素。每个对象只能出现一次。
2. 特点
- 只能存放对象类型,不支持原始类型。
- 对象为弱引用,当引用被删除时,该对象也会自动从WeakSet中移除。
- 没有iterable(可迭代的)方法,因此不能被循环迭代。
3. 用法
WeakSet对象可以用于存储一组对象,并且每个对象只能出现一次。在代码实现中,我们可以使用WeakSet对象来实现对象的去重。下面是一段示例代码:
const weakSet = new WeakSet(); const obj1 = {a:1}; const obj2 = {b:2}; const obj3 = {c:3}; weakSet.add(obj1); weakSet.add(obj2); weakSet.add(obj3); weakSet.add(obj1); // 添加重复元素,没有效果 console.log(weakSet.has(obj1)); // 输出: true console.log(weakSet.has(obj2)); // 输出: true console.log(weakSet.has(obj3)); // 输出: true weakSet.delete(obj1); // 从WeakSet中删除obj1 console.log(weakSet.has(obj1)); // 输出: false
在这段代码中,我们使用WeakSet对象的add()、has()和delete()方法来实现对象的去重以及获取和删除对象。
总结
WeakMap和WeakSet是ES6新增的两种对象类型,它们的特点都是对象为弱引用,当引用被删除时,该对象也会自动从WeakMap或WeakSet中移除。这使得 WeakMap 和 WeakSet 在某些场景下具有一些特殊的用途和优点。例如,可以用 WeakMap 对象来存储和访问对象的私有变量和私有方法,并用 WeakSet 对象来实现对象的去重。掌握了它们的用法,可以在实际开发中跑得更快,写得更好。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65b31c45add4f0e0ffc2d57b