扩展Backbone.js中Model超类的默认值

mcd*_*doh 37 javascript prototypal-inheritance backbone.js

我想把这个问题作为这个答案的问题,但我似乎无法这样做,我道歉.

扩展子类的默认值反映在超类中.这似乎打败了目的,我更倾向于明确列出子类中的超类'默认值来获取我正在寻找的结构.

var Inventory = Backbone.Model.extend({
    defaults: {
        cat: 3,
        dog: 5
    }
});

var ExtendedInventory = Inventory.extend({
});

_.extend(ExtendedInventory.prototype.defaults, {rabbit: 25});

var i = new Inventory();
var ei = new ExtendedInventory();
console.log(i.attributes);
console.log(ei.attributes);
Run Code Online (Sandbox Code Playgroud)

这输出:

{cat: 3, dog: 5, rabbit: 25}
{cat: 3, dog: 5, rabbit: 25}
Run Code Online (Sandbox Code Playgroud)

不是我(也不是我认为,op)想要的:

{cat: 3, dog: 5}
{cat: 3, dog: 5, rabbit: 25}
Run Code Online (Sandbox Code Playgroud)

JCo*_*era 50

问题是Inventory.prototype.defaults并且Extended.prototype.defaults具有相同的引用,因为您没有覆盖引用.

所以你可以用两种方式做到这一点,也许更多,但我只发现这2:

编辑:第一个例子不正确(见评论); 请参考第二个.

var ExtendedInventory = Inventory.extend({
    defaults: {
        rabit:25
    }
});

_.extend(ExtendedInventory.prototype.defaults, Inventory.prototype.defaults);
Run Code Online (Sandbox Code Playgroud)

要么

var ExtendedInventory = Inventory.extend({
    defaults: _.extend({},Inventory.prototype.defaults,
         {rabit:25}
    )
});
Run Code Online (Sandbox Code Playgroud)

我认为第一个看起来更干净.


b73*_*b73 18

我认为解决它的最好方法是使用underscore.js的_.defaults方法.这将允许您覆盖Model子类中的默认值:

_.defaults(ExtendedInventory.prototype.defaults, 
           Inventory.prototype.defaults);
Run Code Online (Sandbox Code Playgroud)

看这个例子:

http://jsfiddle.net/mattfreer/xLK5D/