我不是JavaScript专家,所以我可能在这里做错了。
我有一个简单的Foo Backbone模型,默认属性条是一个空数组。我创建了两个模型实例。我将“a”和“b”添加到第一个模型,“c”和“d”添加到第二个模型。当我用console.log()打印出bar的内容时,看起来两个实例都是同一个对象。
JsFiddle:http://jsfiddle.net/P7qsz/
代码:
var Foo = Backbone.Model.extend({
defaults: {
bars: []
}
});
var foo = new Foo();
foo.get("bars").push("a");
foo.get("bars").push("b");
console.log(foo.get("bars"));
var foo2 = new Foo();
foo2.get("bars").push("c");
foo2.get("bars").push("d");
console.log(foo2.get("bars"));
在控制台中我看到:
["a", "b", "c", "d"]
["a", "b", "c", "d"]
我做错了什么?
答案 0 :(得分:5)
在javascript中,数组(和对象)作为引用传递。
在这里,您为每个模型分配了相同的数组引用。
要修复它,您每次都需要分配一个新数组。
Backbone.Model.extend({
initialize: function() {
this.set("bars", []); // Here we set a new array
}
});
答案 1 :(得分:4)
他们不是单身人士。
console.log(foo === foo2) //false
发生的情况是两个实例共享默认对象,并且它具有对数组的重新声明。所以最后这个模型的所有实例都有相同的数组。
绝不应在默认对象中声明数组和对象,它应该在构造函数中。
var Foo = Backbone.Model.extend({
initialize: function () {
this.set("bars", []);
},
defaults: {
bars: null
}
});