Javascript 扩展主干时出现异常行为。视图

Javascript 扩展主干时出现异常行为。视图,javascript,object,backbone.js,Javascript,Object,Backbone.js,好吧,我最近遇到了这种情况,我不太明白为什么会发生这种情况。有人能解释一下为什么会这样。_views会“异花授粉”?代码如下: var布局=Backbone.View.extend({ _视图:[], addToViews:函数(视图){ 此。_视图。推(视图); }, renderview:function(){ console.log(此视图); } }); var view1=新布局(); 视图1.添加视图(“某些视图”); view1.renderViews()//输出数组(1)[“某些

好吧,我最近遇到了这种情况,我不太明白为什么会发生这种情况。有人能解释一下为什么
会这样。_views
会“异花授粉”?代码如下:

var布局=Backbone.View.extend({
_视图:[],
addToViews:函数(视图){
此。_视图。推(视图);
},
renderview:function(){
console.log(此视图);
}
});
var view1=新布局();
视图1.添加视图(“某些视图”);
view1.renderViews()//输出数组(1)[“某些视图”]
var view2=新布局();
view2.renderViews()//输出数组(1)[“某些视图”]**不正确**

这很好:

var布局=Backbone.View.extend({
//_视图:[],
addToViews:函数(视图){
这个。|视图=这个。|视图|[];
此。_视图。推(视图);
},
renderview:function(){
console.log(此视图);
}
});
var view1=新布局();
视图1.添加视图(“某些视图”);
view1.renderViews()//输出数组(1)[“某些视图”]
var view2=新布局();
view2.renderViews()//输出未定义**正确**​

普通的js实现似乎也能正常工作

var布局=函数(){
var_views=[];
返回{
addToViews:函数(视图){
_视图。推送(视图);
},
renderview:function(){
console.log(_视图);
}
}
};
var view1=新布局();
视图1.添加视图(“某些视图”);
view1.renderViews()//输出数组(1)[“某些视图”]
var view2=新布局();
view2.renderViews()//输出数组(0)[]


那么,当我们创建一个全新的实例时,为什么
视图会保存状态呢?

当您扩展
视图(或任何其他主干类)时,您是在扩展该类的原型。原型在类的所有实例之间共享。这意味着您设置为原型属性的任何对象都将在所有实例之间共享,而不是每个实例所独有的。因此,使用对象或数组属性扩展主干类将在所有实例中创建对该对象的共享引用


有关此问题的更多详细信息,请参阅,因为它会影响使用原型继承的任何类。

当您扩展
视图(或任何其他主干类)时,您正在扩展该类的原型。原型在类的所有实例之间共享。这意味着您设置为原型属性的任何对象都将在所有实例之间共享,而不是每个实例所独有的。因此,使用对象或数组属性扩展主干类将在所有实例中创建对该对象的共享引用


有关此问题的更多详细信息,请参阅,因为它会影响任何使用原型继承的类。

如何在保留在“extended”对象中定义属性的能力的同时修复该行为?我通常会在.initialize()方法中定义它。\u,类似于您的第二个示例。在保留在“扩展”对象中定义属性的能力的同时,如何修复行为?我通常会在.initialize()方法中定义它。\ u视图,类似于您的第二个示例。