3

我不是 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"]

我究竟做错了什么?

4

2 回答 2

5

在 javascript 中,数组(和对象)作为引用传递。

在这里,您为每个模型分配了相同的数组引用。

要修复它,您每次都需要分配一个新数组。

Backbone.Model.extend({
  initialize: function() {
    this.set("bars", []); // Here we set a new array
  }
});
于 2013-06-19T15:33:40.710 回答
4

他们不是单身人士。

console.log(foo === foo2) //false

发生的情况是两个实例共享默认对象,并且它具有对数组的引用。所以最后这个模型的所有实例都有相同的数组。

数组和对象永远不应该在默认对象中声明,它应该在构造函数中。

var Foo = Backbone.Model.extend({
    initialize: function () {
        this.set("bars", []);
    },
    defaults: {
        bars: null
    }
});
于 2013-06-19T15:39:19.010 回答