推动Backbone的属性

ale*_*exb 5 javascript backbone.js

我花了很多时间试图捕捉我的应用程序中的错误.最后我把这段代码分开了,这对我来说似乎很奇怪.

var Model = Backbone.Model.extend({
    myProperty: []
});

var one = new Model();
var two = new Model();
one.myProperty.push(1);
console.log(two.myProperty); //1!!
Run Code Online (Sandbox Code Playgroud)

它背后的原因是什么?为什么会这样呢?如何在代码中避免这种类型的错误?

joe*_*ews 3

JavaScript 中的继承是典型的——对象可以直接引用原型链中更高层的属性。

在您的示例中,onetwo两者共享一个共同的原型,并且不提供自己的值,myProperty因此它们都直接引用Model.protoype.myProperty.

您应该为实例化的每个模型创建新myProperty数组。Model.initialize是这种初始化的惯用位置 - 覆盖 constructor 不必要地复杂。

var Model = Backbone.Model.extend({
    initialize: function() {
      this.myProperty = [];
    }
});
Run Code Online (Sandbox Code Playgroud)

或者,您可以将myProperty其作为模型的属性:

var Model = Backbone.Model.extend({
    defaults: function() {
      return {
        myProperty: []
      }
    }
});
Run Code Online (Sandbox Code Playgroud)

重要的是要注意这defaults是一个函数 - 如果您要使用一个简单的对象,您将遇到相同的共享引用问题。