【问题标题】:Inherit backbone attributes from parent model从父模型继承主干属性
【发布时间】:2012-06-29 11:52:06
【问题描述】:

如果我有这个模型:

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 属性?

【问题讨论】:

    标签: javascript inheritance backbone.js


    【解决方案1】:

    在 github 上有一个 interesting post 有这个问题,我实施的解决方案是这样的:

    myModel.prototype.defaults = 
        _.extend({
            child1: null,
                    child2: null
        }, myParentModel.prototype.defaults, 
           myModel.prototype.defaults);
    

    通过下划线函数:extend,我们有了一个新的对象,默认带有父子原型,这是一个很好的多重继承解决方案

    【讨论】:

      【解决方案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());
      

      【讨论】:

      • 如果你有多个子模型,后面的子模型会继承前面的子模型的属性,这是不可取的。
      【解决方案3】:

      我真的建议使用这样的函数来扩展默认属性:

      var MyParentModel = Backbone.Model.extend({
          defaults: {
              parent1 : '',
              parent2 : ''
          }
      });
      var MyModel = MyParentModel.extend({
          defaults: function() {
              return _.extend(
                  {
                      child1 : '',
                      child2 : ''
                  },
                  MyParentModel.prototype.defaults
              );
          }
      });
      

      原因是您将避免在MyModel 对象的不同实例之间共享新默认属性的一些麻烦

      为了更清楚,如果您的默认属性包含数组并且您多次实例化MyModel,则包含数组的属性将在每个实例之间共享。使用一个函数来声明你的默认属性将避免它。

      我希望我已经足够清楚了。

      【讨论】:

        【解决方案4】:

        你也可以使用 ES6 解构

        const MyParentModel = Backbone.Model.extend({
          defaults: {
            parent1 : '',
            parent2 : ''
          }
        });
        
        const MyModel = MyParentModel.extend({
          defaults: {
            child1: '',
            child2: '',
            ...MyParentModel.prototype.defaults
          }
        });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-22
          • 1970-01-01
          • 1970-01-01
          • 2014-06-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多