1

Trying to wrap my head around this. Google Apps Script does not yet support private properties in a class, as alternative many posts suggest the use of Weak Map and a closure to approximate this behavior. Like this:

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
})()

I've found that using an Object instead of the Weak Map behaves similarly. Like this:

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
})()

to test this:

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);
}

Output:

2:40:50 PM  Info    Larry
2:40:50 PM  Info    Larry
2:40:50 PM  Info    abc987
2:40:50 PM  Info    xyz123
2:40:50 PM  Info    undefined
2:40:50 PM  Info    undefined

Can some explain the advantages of using a Weak Map vs Object?

Barmar
  • 741,623
  • 53
  • 500
  • 612
  • 3
    The difference has to do with garbage collection. The weak map will discard the entry when the object used as the key becomes garbage. The regular object never discards any of the keys, so it just keeps growing. – Barmar Apr 19 '23 at 19:14
  • @Barmar also quite importantly - the WeakMap will keep different values for different instances. An object will share the same "private" value for all instances. https://jsbin.com/betodecuji/edit?js,console – VLAZ Apr 19 '23 at 21:02
  • 1
    Your object does store "private" values per `key`, not per `this`. – Bergi Apr 19 '23 at 23:44
  • Thanks all. @VLAZ I missed shared private value for all instances (good catch). Appreciate all the answers. – Larry Berrill Apr 20 '23 at 12:57

0 Answers0