ecomfe/oo

带逻辑的setter和getter

Opened this issue · 8 comments

有时候settergetter是有逻辑的,但是又希望可以利用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