我花了很多时间试图在我的应用程序中发现错误。最终我将这段代码分开,其行为对我来说似乎很奇怪。
var Model = Backbone.Model.extend({
myProperty: []
});
var one = new Model();
var two = new Model();
one.myProperty.push(1);
console.log(two.myProperty); //1!!
背后的原因是什么?为什么会这样?如何避免代码中的此类错误?
JavaScript 中的继承是典型的——对象可以直接引用 prototype chain 中更高层的属性.
在您的示例中,one
和 two
都共享一个公共(public)原型(prototype),并且不为 myProperty
提供它们自己的值,因此它们都引用直接到 Model.protoype.myProperty
。
您应该为您实例化的每个模型创建新的 myProperty
数组。 Model.initialize
是这种初始化的惯用地方 - 重写 constructor
不必要地复杂。
var Model = Backbone.Model.extend({
initialize: function() {
this.myProperty = [];
}
});
或者,您可以将 myProperty
作为模型的属性:
var Model = Backbone.Model.extend({
defaults: function() {
return {
myProperty: []
}
}
});
重要的是要注意 defaults
是一个函数 - 如果您要使用一个简单的对象,您会遇到相同的共享引用问题。