javascript - 推送到 Backbone 中的属性

标签 javascript backbone.js

<分区>

我花了很多时间试图在我的应用程序中发现错误。最终我将这段代码分开,其行为对我来说似乎很奇怪。

var Model = Backbone.Model.extend({
    myProperty: []
});

var one = new Model();
var two = new Model();
one.myProperty.push(1);
console.log(two.myProperty); //1!!

背后的原因是什么?为什么会这样?如何避免代码中的此类错误?

最佳答案

JavaScript 中的继承是典型的——对象可以直接引用 prototype chain 中更高层的属性.

在您的示例中,onetwo 都共享一个公共(public)原型(prototype),并且不为 myProperty 提供它们自己的值,因此它们都引用直接到 Model.protoype.myProperty

您应该为您实例化的每个模型创建新的 myProperty 数组。 Model.initialize 是这种初始化的惯用地方 - 重写 constructor 不必要地复杂。

var Model = Backbone.Model.extend({
    initialize: function() {
      this.myProperty = [];
    }
});

或者,您可以将 myProperty 作为模型的属性:

var Model = Backbone.Model.extend({
    defaults: function() {
      return {
        myProperty: []
      }
    }
});

重要的是要注意 defaults 是一个函数 - 如果您要使用一个简单的对象,您会遇到相同的共享引用问题。

关于javascript - 推送到 Backbone 中的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27567555/

相关文章:

javascript - JSON数据加载问题本地存储

javascript - 为什么在音频标签内使用源标签会阻止 loadeddata 事件触发?

javascript - 不透明度或页面背景显示在弹出窗口的半页上

javascript - 使用收到的 JSON 数据创建 Backbone 模型

javascript - Backbone.js:区分仍在加载的集合和空集合?

javascript - 你将如何移动一个完整的 backbone.js 树?

javascript - Backbone 过滤器集合按名称返回模型?

javascript - 如何将复选框数组中的数据保存到数据库中

javascript - 过滤前抛出异常?

Backbone.js DELETE 请求未触发