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

Backbone.js BackboneJS-查看重新实例化后保留的类数组变量,backbone.js,Backbone.js,我遇到了一个无法解释的场景/错误,因为我有一个带有数组变量的主干视图类,但即使在我重新实例化它之后,变量值仍然存在。主干视图具有以下设置: var TestView = Backbone.View.extend({ a:"", b:"", items:[], initialize:function(){ }, add:function(value){ this.items.push(value); } }); 下面是我如

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

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

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

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

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

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

首先,在类上下文中定义实例变量不是一个好主意,这就是您要做的:

var TestView = Backbone.View.extend({
  a: "",
  b: "",
  items: []
});
这是存在的原因之一。你应该这样做:

var TestView = Backbone.View.extend({
  initialize: function(){
    this.a = "";
    this.b = "";
    this.items = [];
  }
});
示例代码中出现的情况是
TestView
的所有新引用将共享
String
Array
的相同实例。这是因为在一个实例中更改数组将反映在另一个实例中

最棘手的事情是,你可以灵活地观察到,共享行为似乎不是在字符串中发生的,但事实上它正在发生

发生的情况是,当您这样做时:

this.formView.a = 'abc';
您不是在转换字符串实例,而是将其替换为新实例,以便原始字符串实例保持不变


我想提供一个例子,在一个
TestView
实例中操作字符串,并看到更改反映在另一个
TestView
实例中,但我没有找到任何操作字符串的实例。

我想由于某种原因,重新实例化期间的formView毕竟没有实例化,谢谢您的编辑@缪斯托什特。。。祝贺10万美元,或者我应该感谢10万美元:)