Javascript 离开作用域后,集合状态似乎保持不变

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();

我在backbone.js集合上有一些特殊属性。我举了一个简单的例子来说明:

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希望
属性
被深入复制到每个实例中,而它根本没有被复制。我试图澄清这一点。