实例化覆盖以前的实例(Backbone.js 模型)

Instantiation Overwriting Previous Instances (Backbone.js Models)

我似乎对这个小片段有疑问。我已经摆弄它很长一段时间了,当同名的全局属性在同一模型的下一个实例化时发生更改时,它会不断覆盖所有先前实例化的全局属性。

这个问题的影响是破坏了我正在构建的一个简单的网络导航编辑器,每次获取一个集合时,即使它们是同一集合类型的单独实例,它们也会覆盖任何其他模型由于全局变量被覆盖的集合。

不用说,我已经用头撞墙三天了,无法弄清楚,也无法在 Google 上找到与此类问题相关的任何内容。非常感谢任何对此问题的帮助。

JSFiddle:http://jsfiddle.net/alexgurrola/ruv11nkn/

// Create Example Model
var Model = Backbone.Model.extend({
    globals: {
        attributes: {},
        set: function (prop, value) {
            this.attributes[prop] = value;
        },
        get: function (prop) {
            return this.attributes[prop]
        },
        has: function (prop) {
            return _.has(this.attributes, prop);
        },
        iterate: function (prop) {
            if (!this.has(prop)) this.set(prop, 0);
            return ++this.attributes[prop];
        }
    },
    local: "Unknown"
});

// Create First Instance
var Instance = new Model();
Instance.local = "Instance";
Instance.globals.set("name", "Instance");

// Create Second Instance, which will Overwrite the First, Unintentionally
var Overwrite = new Model();
Overwrite.local = "Overwrite";
Overwrite.globals.set("name", "Overwrite");

因为您的 global 对象是用 Model 声明的,所以上下文绑定到该对象,而不是您稍后创建的实例。它基本上就像一个静态变量,所以每个实例都将引用相同的 attributes 对象。

您似乎想要的是让模型的每个实例都有自己的attributes,您可以这样做,例如,通过在初始化函数中设置它来代替

var Model = Backbone.Model.extend({
    initialize: function () {
        this.globals = {
            attributes: {},
            set: function (prop, value) {
                this.attributes[prop] = value;
            },
            get: function (prop) {
                return this.attributes[prop]
            },
            has: function (prop) {
                return _.has(this.attributes, prop);
            },
            iterate: function (prop) {
                if (!this.has(prop)) this.set(prop, 0);
                return ++this.attributes[prop];
            }
        }
    }
});

这将确保每个实例创建自己的 globals 并且在调用 set 时正确绑定上下文。

不过我有点好奇你为什么要这样做。您好像是在模型中重新实现模型?