骨干模型是单例的吗?

Are Backbone Models Singletons?

本文关键字:单例 模型      更新时间:2023-09-26

我不是JavaScript专家,所以我可能在这里做错了什么。

我有一个简单的Foo Backbone模型,默认属性栏是一个空数组。我创建了模型的两个实例。我将"a"answers"b"添加到第一个模型中,将"c"answers"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"]

我做错了什么?

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

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

要解决这个问题,你需要每次分配一个新的Array。

Backbone.Model.extend({
  initialize: function() {
    this.set("bars", []); // Here we set a new array
  }
});

它们不是单例。

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

两个实例共享默认对象,并且它有对数组的引用。因此,最终该模型的所有实例都具有相同的数组。

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

var Foo = Backbone.Model.extend({
    initialize: function () {
        this.set("bars", []);
    },
    defaults: {
        bars: null
    }
});