11

在过去的两天里,我一直在努力解决这个问题。出于某种原因,主干在继承的子模型之间共享父实例数据。这是一个例子:

var Base = Backbone.Model.extend({

  index : []

});

var Group = Base.extend({

  initialize : function() {
    this.index.push('from group');
  }

});


var User = Base.extend({

  initialize : function() {
    this.index.push('from user');
  }

});


var user = new User();
console.log(user.index); // ['from user']


var group = new Group();
console.log(group.index) // ['from user', 'from group']

我正在寻找的是:

console.log(user.index); // ['from user']
console.log(group.index) // ['from group']

有什么见解吗?

谢谢!马特

4

2 回答 2

14

您所经历的本质上是 JS 通过引用而不是值传递对象(或数组)的方式的副产品。如果您希望用户和组的索引不同,只需在初始化函数中将其实例化为数组即可。

var Base = Backbone.Model.extend({

initialize: function() {
  this.index = [];
}


});
于 2012-04-23T00:51:05.993 回答
6

index 成员就像一个类变量,因为它位于 Base 的原型链中,因此被所有实例共享,就像它包含的方法也是共享的一样。尝试切换实例化用户和组的顺序。现在索引包含什么?是反了吧?那是因为它们共享对象传递给扩展的所有内容。

为了使它成为一个实例变量,您需要在 Base 的构造函数中实例化它,并让每个子类从它们各自的构造函数中调用该构造函数。像:

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

var User = Base.extend({
    initialize: function() {
        Base.prototype.initialize.call( this );
        this.index.push('User');
    }
});

// repeat it for group.
于 2012-04-23T00:54:17.553 回答