带逻辑的setter和getter
Opened this issue · 8 comments
有时候setter
和getter
是有逻辑的,但是又希望可以利用oo
隐藏掉具体的属性强制只能使用getter
访问,是否有可能实现类似的功能。
有2个想法,第一种是静态方法:
exports.setFoo = function (value) {
value.bar = true;
oo.set(this, 'foo', value);
};
exports.getFoo = function () {
var value = oo.get(this, 'foo');
value.bar = false;
return value;
};
第二种是hook模式:
oo.defineAccessor(
exports,
'foo',
{
getHook: function (value) {
// value是oo拿到的
value.bar = false;
return value; // 返回给外面
},
setHook: function (value) {
// value是传进来的
value.bar = true;
return value; // 随后会被真正set
}
}
);
已经支持,见第三个参数
艾玛,文档没加上,手机不方便写字,白天说
代码中是这样的:
obj[setter] = !accessor || typeof accessor.set !== 'function' ? simpleSetter(name) : accessor.set;
但是我如果提供了set
,又不知道怎么实现,因为没地方让我放这个value
确实没法满足隐藏属性的需求,我改改,大概按第二种模式
这个 feature 似乎 readme 里没有?
这个 feature 似乎 readme 里没有?
带逻辑的 hook 还没实现,因为想着如果能支持 private 成员的话,这个可能没有太大意义了;
目前第三个参数只支持传入 setter/getter 覆盖默认的 simpleAccessor,这块文档确实遗漏了,我后面补补
目测覆盖 simpleAccessor
的话得把 this.__eooPrivateMembers__
传给 accessor,但是这样就不是 private
了……所以第三个参数目前感觉没啥意义?
目测覆盖 simpleAccessor 的话得把 this.eooPrivateMembers 传给 accessor,但是这样就不是 private 了……所以第三个参数目前感觉没啥意义?
按 @otakustay 的意思是,第三个参数是个 hook,在eooPrivateMembers上添加私有成员,外部使用的时候只能通过 set/get去操作这个成员,无法直接获取。
如果支持了 private 特性的话,eooPrivateMembers就没有必要了。
目前第三个参数只是可以提供自定义的 setter/getter,可以在这里面做一些额外的逻辑,至于成员的存储还是需要使用者自己来做了,因为目前没有将eooPrivateMembers暴露给 setter/getter