Javascript BackboneJS中意外的构造函数/扩展行为
对JavaScript/BackboneJS的工作原理感到非常困惑。让我们考虑下面的例子:Javascript BackboneJS中意外的构造函数/扩展行为,javascript,constructor,backbone.js,extend,Javascript,Constructor,Backbone.js,Extend,对JavaScript/BackboneJS的工作原理感到非常困惑。让我们考虑下面的例子: window.MyView = Backbone.View.extend({ index: 0, list: [], initialize: function () { console.log("Initializing MyView"); console.log("this.index = " + this.index);
window.MyView = Backbone.View.extend({
index: 0,
list: [],
initialize: function () {
console.log("Initializing MyView");
console.log("this.index = " + this.index);
console.log("this.list = [" + this.list.join(',') + "]");
this.index++;
this.list.push(this.index);
}
});
var first = new MyView(),
second = new MyView();
我在这里所期望的是,new MyView()将创建window.MyView“类”的一个干净副本,因此突发事件将是:
Initializing MyView
this.index = 0
this.list = []
Initializing MyView
this.index = 0
this.list = []
但是我有
Initializing MyView
this.index = 0
this.list = []
Initializing MyView
this.index = 0
this.list = [1] // Very unexpected!
令人困惑的是,整型变量“index”实际上如预期的那样为0,但数组“list”已经包含了来自上一次初始化的值。怎么会这样
演示以下两个答案很好地解释了
列表
和索引
的不同行为:
和list
都存在于index
的原型上MyView
- 创建
后,new MyView()
在新创建的实例(即不是原型)的上下文中运行initialize()
- 当您
将某物推到push()
上时,您将其推到原型引用的列表对象上。您根本没有更新对列表的引用,只是阅读它list
- 当您
时,实际上会在幕后执行赋值(index++
)。当您将某个对象指定给某个对象时,它是否存在于原型上并不重要—您正在将其指定给该特定实例。原型没有改变this.index=this.index+1
对于预期的行为,只需在
initialize
函数中设置这两个属性:
window.MyView = Backbone.View.extend({
initialize: function () {
this.index = 0;
this.list = [];
this.index++;
this.list.push(this.index);
}
});
我不知道主干,但似乎
列表
/索引
都放在原型中,所以它们在两个实例中引用相同的值。基于每个实例在初始化时设置它们可以起作用:。不过,我不确定这是否是答案。这确实是答案。看看他们的扩展函数的实现细节,效果非常好。但为什么(int)“index”变量的行为类似于对象变量呢?它不会保留该值。而(数组)“list”变量的行为类似于静态变量?我的假设是,它们都将值持久化,最后的返回应该是:this.index=1;this.list=[1]@ViliusPau-看看-这是一个很好的解释。