我知道这是 javascript 本身的问题(或行为),而不是 Backbone 的扩展方法,但我想知道避免它的最佳策略是什么。
让我们更好地把它放在代码中:
var MyModel = Backbone.Model.extend({
value: 0,
values: []
});
var myFirstModel = new MyModel();
myFirstModel.value // 0, as expected
myFirstModel.values // [], as expected
var mySecondModel = new MyModel();
mySecondModel.value = 2;
mySecondModel.values.push(2)
mySecondModel.value // 2, as expected
mySecondModel.values // [2], as expected
myFirstModel.value // 0, as expected
myFirstModel.values // [2], ... WAT!!!
我确实知道问题是我没有为 mySecondModel.values 分配新值我只是在原型中的 values 变量上进行操作,即 MyModel.prototype.values (与任何其他对象相同的问题,课程)
但这很容易搞砸。最直观的事情是将它们视为实例变量,而不是每个实例共有的变量(基于类的语言中的静态或类变量)。
到目前为止,我发现的一般解决方案是在初始化方法中初始化每个变量,如下所示:
var MyModel = Backbone.Model.extend({
initialize: function() {
this.value = 0;
this.values = [];
}
});
这样,一切都按预期工作,即使对于一个简单的值(比如 this.value)来说它不是必需的,我发现在每种情况下都坚持这个原则要容易得多。
我想知道这个问题是否有更好(更优雅,更清晰)的解决方案