Backbone模型单身人士?

时间:2013-06-19 15:28:37

标签: javascript backbone.js

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

我做错了什么?

2 个答案:

答案 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
    }
});