Javascript 主干模型默认共享状态吗
我有两个模型实例,发现它们之间似乎共享状态。我本以为会发生相反的情况。例如:Javascript 主干模型默认共享状态吗,javascript,backbone.js,Javascript,Backbone.js,我有两个模型实例,发现它们之间似乎共享状态。我本以为会发生相反的情况。例如: var Q = Backbone.Model.extend({ defaults: { fooObj: { bar: {} } }, initialize: function() { _.bindAll(this, 'addFoo'); }, addFoo: function(f) { //get fooObj fo = t
var Q = Backbone.Model.extend({
defaults: {
fooObj: {
bar: {}
}
},
initialize: function() {
_.bindAll(this, 'addFoo');
},
addFoo: function(f) {
//get fooObj
fo = this.get('fooObj');
fo.bar[1] = f;
//set it back
this.set('fooObj', fo);
},
getFoo: function (argument) {
return this.get('fooObj');
}
})
q1 = new Q();
q2 = new Q();
q1.addFoo({iam: 'foo'});
console.log(q2.getFoo().bar[1]); // {iam : "foo"}
虽然我将
{iam:“foo”}
添加到实例q1
,但它似乎也被传播到q2
。我错过了一个技巧吗?看来get
和set
是访问模型数据的正确安全方式,但它会导致这种行为(或者这是预期的)?是的,将共享fooObj
,因为您在模型定义时只创建一个
而是使用函数创建默认值(请参见):
是的,
fooObj
将被共享,因为您在模型定义时只创建一个
而是使用函数创建默认值(请参见):
文档甚至说:记住,在JavaScript中,对象是通过引用传递的,因此如果您将一个对象作为默认值,它将在所有实例之间共享。文档甚至说:记住,在JavaScript中,对象是通过引用传递的,因此如果您将一个对象作为默认值,它将在所有实例之间共享。
defaults: function() {
return {
fooObj: {
bar: {}
}
};
}