Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/446.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript BackboneJS中意外的构造函数/扩展行为_Javascript_Constructor_Backbone.js_Extend - Fatal编程技术网

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

对JavaScript/BackboneJS的工作原理感到非常困惑。让我们考虑下面的例子:

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-看看-这是一个很好的解释。