在扩展骨干模型或视图时,如何创建在实例上而不是在原型上创建的属性?

Par*_*ife 7 javascript backbone.js

我想要做:

var MyModel = Backbone.model.extend({
  someProp: { ... },
  .
  .
  });
Run Code Online (Sandbox Code Playgroud)

但要 new MyModel().someProp === new MyModel().someProp回来了false

好像我做了

function MyModel() {
 this.someProp = {...};
}
Run Code Online (Sandbox Code Playgroud)

我不想把赋值this.someProp = {...};放在initialize方法中,因为如果我将MyModel子类化,我将不得不再次在子类的initialize方法中重复赋值,或者记得每次从子类初始化时都要调用父类初始化,这似乎是我作为一种解决方法而不是解决方案.那么,还有其他方法吗?

Pau*_*aul 8

如果你想将它用于多个模型,那么一个解决方案是创建一个独立的函数来处理它,然后你可以从模型的初始化方法中调用该函数.

这是一个例子

function addInstanceProperties() {
  this.someProp = 'hello';
  this.otherProp = 'world';
}

var Parent = Backbone.Model.extend({
  initialize: function() {
    //have to use 'call' so the context is set to this model
    addInstanceProperties.call(this); 
  }
});

var Child = Parent.extend({
  initialize: function() {
    addInstanceProperties.call(this);
  }
});
Run Code Online (Sandbox Code Playgroud)

但是,这与在父级中具有属性赋值并让子级调用父级的初始化方法没有任何不同.并且涉及的代码更少.

var Parent = Backbone.Model.extend({
  initialize: function() {
    this.someProp = 'hello';
    this.otherProp = 'world';
  }
});

var Child = Parent.extend({
  initialize: function() {
    Parent.prototype.initialize.call(this);
  }
});
Run Code Online (Sandbox Code Playgroud)

除非你想在每个初始化方法中重复属性赋值,否则这实际上是在Javascript中执行此操作的唯一方法.