在 Backbone Todo MVC source中,函数的原生apply方法用于调用 Underscore 方法,没有,我不明白为什么它是必要的。
// Filter down the list of all todo items that are finished.
completed: function() {
return this.filter(function( todo ) {
return todo.get('completed');
});
},
// Filter down the list to only todo items that are still not finished.
remaining: function() {
return this.without.apply( this, this.completed() );
},
与其他 Underscore 方法(例如filter )相比,对without的调用显得格格不入。我仔细检查了 Backbone 源,以确保没有以不同的方式混合到 Collection 对象中。果然,不是。
这就是下划线方法附加到 Collection 的方式:
_.each(methods, function(method) {
Collection.prototype[method] = function() {
var args = slice.call(arguments);
args.unshift(this.models);
return _[method].apply(_, args);
};
});
正如所料 - Collection 的模型已经作为第一个参数传递。此外,由于方法是在 Collection 对象上调用的,因此这将是正确的。
我通过将方法更改为以下来验证这一点
this.without(this.completed());
这很好用。
我在这里俯瞰什么?