解析 ES6 的 WeakMap 和 WeakSet 对象

前言

随着前端技术的发展,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