将两个 backbone 集合扩展到另一个 backbone 集合

Extend two backbone collections into another backbone collection

我有

CollectionA = Backbone.collection.extend({ a : function() {} });
CollectionB = Backbone.collection.extend({ b : function() {} });

如何将 CollectionC 定义为包含 CollectionACollectionB 的所有函数以及它自己的函数 c 的集合?

_.extend(CollectionC,CollectionB,CollectionA)

您可以在 _.extend 的帮助下将 CollectionACollectionB 的原型混合到 CollectionC 的原型中:

var A = Backbone.Collection.extend({
    a: function() { console.log('a'); },
    croak: function() { console.log('croak a'); }
});
var B = Backbone.Collection.extend({
    b: function() { console.log('b'); },
    croak: function() { console.log('croak b'); }
});
var C = Backbone.Collection.extend({
    c: function() { console.log('c'); },
    croak: function() { console.log('croak c'); }
});

_.extend(C.prototype, A.prototype, B.prototype);

var c = new C();
c.a(); // outputs a
c.b(); // outputs b
c.c(); // outputs c

注意,如果一个方法被定义多次,会被最后一个混进去遮蔽:c.croak();会输出b

还有一个演示 http://jsfiddle.net/nikoshr/yjb3g3e3/

如果你想阻止某些方法的隐藏,你可以 pick/omit 来自 mixin:

_.extend(C.prototype, 
    _.omit(A.prototype, 'croak'),
    _.omit(B.prototype, 'croak')
);

c.croak(); // outputs c

http://jsfiddle.net/nikoshr/yjb3g3e3/1/

或之后在 C 上设置该方法:

var C = Backbone.Collection.extend({
    c: function() { console.log('c'); }
});

_.extend(C.prototype, A.prototype, B.prototype);
C.prototype.croak = function() { console.log('croak c'); }

http://jsfiddle.net/nikoshr/yjb3g3e3/3/