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/