将两个主干集合扩展到另一个主干集合

时间:2015-01-13 10:09:21

标签: javascript backbone.js

我有

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

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

2 个答案:

答案 0 :(得分:1)

_.extend(CollectionC,CollectionB,CollectionA)

答案 1 :(得分:1)

您可以在_.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/

如果你想阻止某些方法的阴影,你可以从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/