weakMap的缓存

WeakMap的一个典型应用场景是存储与特定对象关联的元数据,同时确保这些元数据不会阻止对象被垃圾回收。以下是几个具体的使用案例:

DOM元素的元数据存储

在Web开发中,有时需要为DOM元素附加一些额外的信息,但又不希望这些附加信息影响到元素本身的生命周期管理。使用WeakMap可以很好地解决这个问题。

const elementData = new WeakMap();

function setElementData(element, data) {
  elementData.set(element, data);
}

function getElementData(element) {
  return elementData.get(element);
}

// 使用示例
const someElement = document.getElementById('some-element');
setElementData(someElement, { foo: 'bar' });

console.log(getElementData(someElement)); // 输出: { foo: 'bar' }

// 当someElement不再被页面引用,且从DOM中移除后,
// 相关的elementData也会自动被垃圾回收机制清理。

实现私有属性

WeakMap可以用来模拟类的私有属性,因为通过WeakMap存储的属性外界无法直接访问,只有通过类的方法才能操作。

class MyClass {`在这里插入代码片`
  constructor() {
    // 私有属性存储
    this._privateData = new WeakMap();
    this._initializePrivateData();
  }

  _initializePrivateData() {
    this._privateData.set(this, { secretValue: 42 });
  }

  getSecretValue() {
    return this._privateData.get(this).secretValue;
  }
}

const instance = new MyClass();
console.log(instance.getSecretValue()); // 输出: 42
// 但无法直接访问或修改_secretValue```

数据缓存

对于那些需要基于对象计算得到的结果,可以使用WeakMap来缓存这些结果,避免重复计算。如果原始对象被回收,相应的缓存也会自动释放。

const expensiveCalculationCache = new WeakMap();

function expensiveCalculation(obj) {
  if (expensiveCalculationCache.has(obj)) {
    return expensiveCalculationCache.get(obj);
  }
  
  // 模拟复杂的计算过程
  const result = /* ... */;
  
  expensiveCalculationCache.set(obj, result);
  return result;
}

const obj = {};
console.log(expensiveCalculation(obj)); // 首次计算
console.log(expensiveCalculation(obj)); // 使用缓存的结果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值