如果我有这个型号:
var myParentModel = Backbone.Model.extend({
defaults:{ parent1: null,
parent2: null}
)};
我有另一个模特:
var myModel = myParentModel.extend({
defaults: {child1: null,
child2: null}
)};
如果我实现新的myModel:
var mymodel = new myModel({child1: 'mychild1'});
在attributes属性中我只设置为默认child2属性,实现如何继承父模型的parents属性?
答案 0 :(得分:3)
在github中有一个interesting post有这个问题,我实现的解决方案是:
myModel.prototype.defaults =
_.extend({
child1: null,
child2: null
}, myParentModel.prototype.defaults,
myModel.prototype.defaults);
使用下划线函数:extend,我们有一个新的对象默认使用父和子原型,这是一个很好的多重继承解决方案
答案 1 :(得分:2)
我使用了这个,此时如果你在同一范围内则不需要使用原型:
var abstractDefaults = {
parent1 : '',
parent2 : ''
};
var MyParentModel = Backbone.Model.extend({
defaults: abstractDefaults
});
var MyModel = Backbone.Model.extend({
defaults: _.extend( abstractDefaults, {
child1 : '',
child2 : ''
} )
});
console.log(new MyModel().toJSON());
答案 2 :(得分:1)
我真的建议使用函数来扩展默认属性,如下所示:
var MyParentModel = Backbone.Model.extend({
defaults: {
parent1 : '',
parent2 : ''
}
});
var MyModel = MyParentModel.extend({
defaults: function() {
return _.extend(
{
child1 : '',
child2 : ''
},
MyParentModel.prototype.defaults
);
}
});
原因是您可以通过共享引用MyModel
对象的不同实例之间的新默认属性来避免一些麻烦
为了更清楚,如果您的默认属性包含数组,并且多次实例化MyModel
,则每个实例之间将共享包含该数组的属性。使用函数声明默认属性将避免它。
我希望我足够清楚。
答案 3 :(得分:1)
您也可以使用ES6解构
const MyParentModel = Backbone.Model.extend({
defaults: {
parent1 : '',
parent2 : ''
}
});
const MyModel = MyParentModel.extend({
defaults: {
child1: '',
child2: '',
...MyParentModel.prototype.defaults
}
});