Javascript 从父模型继承主干属性
如果我有这个模型:Javascript 从父模型继承主干属性,javascript,inheritance,backbone.js,Javascript,Inheritance,Backbone.js,如果我有这个模型: var myParentModel = Backbone.Model.extend({ defaults:{ parent1: null, parent2: null} )}; 我还有另一个模型: var myModel = myParentModel.extend({ defaults: {child1: null, child2: null} )}; 如果我实例化一个新的myModel: var my
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属性?在github中,有一个与此相关的问题,我实现的解决方案是:
myModel.prototype.defaults =
_.extend({
child1: null,
child2: null
}, myParentModel.prototype.defaults,
myModel.prototype.defaults);
使用下划线函数:extend,我们有了一个新的对象默认值和父对象和子对象原型,这是一个很好的多继承解决方案。在github中,有一个与此相关的问题,我实现的解决方案是:
myModel.prototype.defaults =
_.extend({
child1: null,
child2: null
}, myParentModel.prototype.defaults,
myModel.prototype.defaults);
使用下划线函数:extend,我们有了一个新的对象默认值和父对象和子对象原型,这是一个很好的多继承解决方案我使用了它,在这一点上,如果您在同一范围内,就不需要使用原型:
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());
我使用了这个,在这一点上,如果您在相同的范围内,就不需要使用prototype:
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());
我真的建议使用函数来扩展默认属性,如下所示:
var MyParentModel = Backbone.Model.extend({
defaults: {
parent1 : '',
parent2 : ''
}
});
var MyModel = MyParentModel.extend({
defaults: function() {
return _.extend(
{
child1 : '',
child2 : ''
},
MyParentModel.prototype.defaults
);
}
});
原因是在MyModel
对象的不同实例之间共享对新默认属性的引用可以避免一些问题
更清楚地说,如果默认属性包含数组,并且多次实例化MyModel
,则包含数组的属性将在每个实例之间共享。使用函数声明默认属性可以避免这种情况
我希望我足够清楚。我真的建议使用函数来扩展默认属性,如下所示:
var MyParentModel = Backbone.Model.extend({
defaults: {
parent1 : '',
parent2 : ''
}
});
var MyModel = MyParentModel.extend({
defaults: function() {
return _.extend(
{
child1 : '',
child2 : ''
},
MyParentModel.prototype.defaults
);
}
});
原因是在MyModel
对象的不同实例之间共享对新默认属性的引用可以避免一些问题
更清楚地说,如果默认属性包含数组,并且多次实例化MyModel
,则包含数组的属性将在每个实例之间共享。使用函数声明默认属性可以避免这种情况
我希望我足够清楚。您也可以使用ES6解构
const MyParentModel = Backbone.Model.extend({
defaults: {
parent1 : '',
parent2 : ''
}
});
const MyModel = MyParentModel.extend({
defaults: {
child1: '',
child2: '',
...MyParentModel.prototype.defaults
}
});
您还可以使用ES6解构
const MyParentModel = Backbone.Model.extend({
defaults: {
parent1 : '',
parent2 : ''
}
});
const MyModel = MyParentModel.extend({
defaults: {
child1: '',
child2: '',
...MyParentModel.prototype.defaults
}
});
如果有多个子模型,则后一个子模型将继承前一个子模型的属性,这是不可取的。如果有多个子模型,则后一个子模型将继承前一个子模型的属性,这是不可取的。