Javascript 离开作用域后,集合状态似乎保持不变
我在backbone.js集合上有一些特殊属性。我举了一个简单的例子来说明:Javascript 离开作用域后,集合状态似乎保持不变,javascript,jquery,backbone.js,underscore.js,Javascript,Jquery,Backbone.js,Underscore.js,我在backbone.js集合上有一些特殊属性。我举了一个简单的例子来说明: TestCollection = Backbone.Collection.extend({ properties: { something: 'foo', other: 'bar' } }); 假设test是在点击url#test时调用的路由。它运行这个方法 test: function(){ var c = new TestCollection();
TestCollection = Backbone.Collection.extend({
properties: {
something: 'foo',
other: 'bar'
}
});
假设test
是在点击url#test
时调用的路由。它运行这个方法
test: function(){
var c = new TestCollection();
console.log(c.properties.something);
c.properties.something = 'changed';
},
如果我随后访问另一个散列,比如说
#anythingelse
,然后返回到#test
,控制台仍然记录“changed”
,而不是“foo”
的值。创建集合时,我需要将状态设置为“重置”。当我有一个局部变量时,为什么状态仍然存在?我尝试了一些方法,如\uux0.clone
,尝试“备份”一些属性,并在初始化函数中检索它们,但还没有成功。我希望我只是完全误解了一些事情,并且有一个简单的解决方案。您的所有TestCollection实例最终将共享完全相同的属性
值,因为没有进行深度复制;事实上,正如下面的注释所示,由于属性
附加到原型而不是实例,因此根本不存在复制。例如,这将在控制台中为您提供三个煎饼
,因为这三个实例在其属性中共享完全相同的{something:''.'}
对象:
TestCollection = Backbone.Collection.extend({
properties: {
something: 'foo'
},
m: function(x) {
this.properties.something = x;
}
});
var t1 = new TestCollection();
var t2 = new TestCollection();
t1.m('pancakes');
console.log(t1.properties.something);
console.log(t2.properties.something);
var t3 = new TestCollection();
console.log(t3.properties.something);
演示:
摆脱这一困境的一个简单方法是将属性
移动到集合的初始化
:
TestCollection = Backbone.Collection.extend({
initialize: function() {
this.properties = {
something: 'foo'
};
},
m: function(x) {
this.properties.something = x;
}
});
如果您使用此版本的TestCollection
,那么您将在控制台中获得一个pancakes
和两个foo
s
演示:只是要指出,所有TestCollection
实例是否都具有公共properties
属性与深度复制无关。在第一个示例中,通过在extend
上定义properties
,您将其添加到TestCollection.prototype中,使单个引用可用于TestCollection的所有实例,而在第二个示例中,您为每个TestCollection实例创建它。@ggozad:Right,OP希望属性
被深入复制到每个实例中,而它根本没有被复制。我试图澄清这一点。