试图解决这个问题。 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 的优势吗?