ecomfe/er

Model的set和fill返回设置的值

Closed this issue · 5 comments

返回个东西会死啊……

setter 类型的方法返回当前的上下文 this,方便 chainable。
另外 setfill 是不是可以合成1个方法,比如:

model.set({
    'key': 'value'
});

model.set('key', 'value');

我记得以前在es-discuss上有一个关于这个的讨论,不过讨论的是Set.prototype.add,类似吧

总得来说,有2种意见,第一种就是你说的,返回this,那么好处是

set.add('a').add('b').add('c');

可以链式调用

另外一种意见,就是返回添加的东西,那么好处是

var foo = set.add({ x: 1 });
console.log(foo.x);

可以一行代码写完需要的逻辑,否则就需要这样

var foo = { x: 1 };
set.add(foo);
console.log(foo.x);

当时邮件里大家比较倾向于第2种即返回添加的值,原因是链式调用本身对debug的不友好性是不少人不想见到的,因此在两者都有适用场景的情况下,后者让更多人接受

当然最后Set.prototype.add确实返回了this……


说说我的考虑,主要是面对一个场景:

MyModel.prototype.datasource = {
    entity: function (model) {
        return ajax.get('user/' + model.get('id'))
            .then(model.fill);
    }
};

model.fill返回参数本身时,这个Model实现了“将entity里的属性全部作为Model的属性,同时加一个叫entity属性放整个对象”的功能,这在我们的业务中会经常用到。

而当model.fill返回其它,比如this时,我就必须这么写代码:

MyModel.prototype.datasource = {
    entity: function (model) {
        return ajax.get('user/' + model.get('id'))
            .then(function (entity) {
                model.fill(entity);
                return entity;
            });
    }
};

相对来说“不那么美”,仅此而已


所以关于这个问题,我很想再多听一些人的意见,最后我们决定一个

从这两个例子来看,我倾向于第一个,明显要清晰很多

还是按着ECMA的标准来,返回this吧,希望以后这东西内部可以用Set来实现

又看了下,不大对。因为remove原本的实现是返回移除的对象,那如果set返回this缺乏一致性,所以最终还是决定返回添加的那个对象了