一个实例的对象和数组被Backbone模型的新实例引用

时间:2013-06-24 08:52:01

标签: javascript arrays object backbone.js model

我正在使用主干模型,并且非常惊讶地发现我的JSON对象和设置在我的Backbone模型的特定实例中的数组也可以被其他实例访问。

 var myModel = Backbone.Model.extend({
  defaults: { 
    exp: [],
    name: '',
    json: { }
  },

  getExp: function() {
    return this.get('exp');
  },

  getJSON: function() {
    return this.get('json');
  }
});

var m1 = new myModel();
var experiences = m1.getExp();
experiences.push('arrayitem1');
experiences.push('arrayitem2'); //Setting values for array of m1

m1.set('name', 'my name');

var json = m1.getJSON();
json.key = 'somevalue';

var m2 = new myModel();
console.log(m1.attributes);
console.log(m2.attributes);

输出:

{"exp": ["arrayitem1", "arrayitem2"], "json": {"key": "somevalue"}, "name": "my name"}
{"exp": ["arrayitem1", "arrayitem2"], "json": {"key": "somevalue"}, "name": ""}

m2的键值对

  • m2内的名称属性是默认值。 (正如所料)
  • exp:与m1相同(不预期)
  • json:与m1相同(不是预期的)

JSBIN DEMO

我无法解释这种行为。

更新

我想知道我该如何解决它。我已经添加了一个答案(Kinda hacky),因为它对我有用,但我不知道它是否正确。很想知道这种行为的原因。我做错了什么或者这是Backbone中的某种错误。

1 个答案:

答案 0 :(得分:1)

有一个我用来解决这个问题的黑客攻击。在initialize方法中重置Backbone模型中用作属性的所有对象和数组。

var myModel = Backbone.Model.extend({
  defaults: { 
    exp: [],
    name: '',
    json: { }
  },

  getExp: function() {
    return this.get('exp');
  },

  getJSON: function() {
    return this.get('json');
  },

  initialize: function() {
    this.set('exp', []);
    this.set('json', {});
  }
});

var m1 = new myModel();
var experiences = m1.getExp();
experiences.push('arrayitem1');
experiences.push('arrayitem2');

m1.set('name', 'my name');
var json = m1.getJSON();
json.key = 'somevalue';

var m2 = new myModel();
console.log(m1.attributes);
console.log(m2.attributes);

Working Demo at JSBIN