gpt4 book ai didi

backbone.js - BackboneJS - 查看重新实例化后保留的类数组变量

转载 作者:行者123 更新时间:2023-12-01 10:04:29 25 4
gpt4 key购买 nike

我遇到了一个我无法解释的场景/错误,因为我有一个带有数组变量的 Backbone View 类,但即使在我重新实例化它之后变量值仍然存在。 Backbone View 具有以下设置:

var TestView = Backbone.View.extend({
a:"",
b:"",
items:[],
initialize:function(){

},
add:function(value){
this.items.push(value);
}
});

下面是我如何实例化这个类:

this.formView = new TestView();
this.formView.add('halo');
this.formView.a = 'abc';

this.formView = new TestView();
this.formView.add('test');
this.formView.b = 'bcd';

console.log("a - " + this.formView.a);
console.log("b - " + this.formView.b);
console.log("items - ");
console.log(this.formView.items);

结果:

a -  
b - bcd
items - ["halo", "test"]

令人惊讶的是,数组变量“items”仍然存在,并且它同时显示了 ['halo','test']。但不适用于普通变量。

这是 JsFiddle link .

可以通过在初始化函数中清除数组来解决。

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

但我想知道这是一个错误还是我误解了什么。

最佳答案

嗯,这个问题很棘手,但它有一个解释。

首先,在类上下文中定义实例变量不是个好主意,这就是你正在做的事情:

var TestView = Backbone.View.extend({
a: "",
b: "",
items: []
});

这是原因之一Model.defaults存在。你宁愿这样做:

var TestView = Backbone.View.extend({
initialize: function(){
this.a = "";
this.b = "";
this.items = [];
}
});

您的示例代码中发生的是 TestView 的所有新引用将共享 StringArray 的相同实例。这是因为在一个实例中更改数组将反射(reflect)在另一个实例中。

最棘手的事情是,您很敏捷地观察到,共享行为似乎没有发生在字符串上,但实际上它正在发生。

发生的事情是当你这样做时:

this.formView.a = 'abc';

您不是转换 String 实例,而是将其替换为一个新实例,这样原始 String 实例保持不变。

我想提供一个示例,在一个 TestView 实例中操作 String 并看到更改反射(reflect)在另一个 TestView 实例中,但是我没有找到任何 JS String method就地操作字符串。

关于backbone.js - BackboneJS - 查看重新实例化后保留的类数组变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12087938/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com