从父模型继承骨干属性

时间:2012-06-29 11:52:07

标签: 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 mymodel = new myModel({child1: 'mychild1'});

在attributes属性中我只设置为默认child2属性,实现如何继承父模型的parents属性?

4 个答案:

答案 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
  }
});