【问题标题】:Are Backbone Models Singletons?骨干模型是单例吗?
【发布时间】:2013-06-19 15:28:37
【问题描述】:

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

我做错了什么?

【问题讨论】:

    标签: javascript backbone.js


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      他们不是单身人士。

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

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

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

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

      【讨论】:

      • 数组和对象永远不应该在默认对象中声明,它应该在构造函数中。 实际上,backbone docs 建议在默认值中使用一个函数来返回一个新数组/对象。 Fiddle
      • 你是对的。但是不将 obj 添加到默认值的规则适用于所有 JS,而不仅适用于主干。
      猜你喜欢
      • 2013-10-14
      • 2014-06-25
      • 2012-05-04
      • 2012-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多