使用弱映射和带闭包的对象模拟类的私有属性有什么区别?

问题描述 投票:0回答:0

试图解决这个问题。 Google Apps Script 尚不支持类中的私有属性,作为替代方案,许多帖子建议使用 Weak Map 和闭包来近似此行为。像这样:

const myPrivate1 = (() => {
  const _private = new WeakMap();

  class myPrivate1{
    constructor({key, value}={}) {
      let obj = {};
      obj[key] = value;
      _private.set(this, obj);
    }

    getPrivate(key) {
      return _private.get(this)[key]
    }

    setPrivate({key, value}) {
      let priv_attrs = _private.get(this)
      priv_attrs[key] = value;
      _private.set(this, priv_attrs);
    }

  }

  return myPrivate1
})()

我发现使用 Object 而不是 Weak Map 的行为相似。像这样:

const myPrivate2 = (() => {
  const _private = new Object();

  class myPrivate2{
    constructor({key, value}={}) {
      _private[key] = value;
    }

    getPrivate(key) {
      return _private[key]
    }

    setPrivate({key, value}) {
      _private[key] = value;  
    }

  }

  return myPrivate2
})()

测试这个:

const testPrivate = () => {
  const testObj1 = new myPrivate1({key: 'id', value: 'xyz123'});
  const testObj2 = new myPrivate2({key: 'id', value: 'xyz123'});

  testObj1.setPrivate({key: 'name', value: 'Larry'});
  testObj2.setPrivate({key: 'name', value: 'Larry'})
  console.log(testObj1.getPrivate('name'));
  console.log(testObj2.getPrivate('name'));

  testObj1.setPrivate({key: 'id', value: 'abc987'});
  console.log(testObj1.getPrivate('id'));
  console.log(testObj2.getPrivate('id'));
  
  console.log(testObj1._private);
  console.log(testObj2._private);
}

输出:

2:40:50PM 信息拉里 下午 2:40:50 信息拉里 下午 2:40:50 信息 abc987 下午 2:40:50 信息 xyz123 下午 2:40:50 信息未定义 下午 2:40:50 信息未定义

可以解释一下使用 Weak Map 与 Object 的优势吗?

javascript google-apps-script closures private-members weakmap
© www.soinside.com 2019 - 2024. All rights reserved.