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

如果有多个子模型,则后一个子模型将继承前一个子模型的属性,这是不可取的。如果有多个子模型,则后一个子模型将继承前一个子模型的属性,这是不可取的。