javascript - 扩展 Backbone.View 时的奇怪行为

标签 javascript object backbone.js

好吧,我最近遇到了这个问题,但我不太明白为什么会发生。有人可以解释为什么 this._views 会“异花授粉”吗?代码如下:

var layout = Backbone.View.extend({
    _views: [],
    addToViews: function(view) {
        this._views.push(view);
    },
    renderViews: function() {
        console.log(this._views);
    }
});

var view1 = new layout();
view1.addToViews('some view');
view1.renderViews(); //outputs array(1)['some view']

var view2 = new layout();
view2.renderViews(); //outputs array(1)['some view'] **incorrect!**

jsfiddle

这工作正常:

var layout = Backbone.View.extend({
    //_views: [],
    addToViews: function(view) {
        this._views = this._views || [];
        this._views.push(view);
    },
    renderViews: function() {
        console.log(this._views);
    }
});

var view1 = new layout();
view1.addToViews('some view');
view1.renderViews(); //outputs array(1)['some view']
var view2 = new layout();
view2.renderViews(); //outputs undefined **correct**​

fiddle me batman

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

var layout = function() {
    var _views = [];
    return {
        addToViews: function(view) {
           _views.push(view);
        },
        renderViews: function() {
            console.log(_views);
        }
    }
};

var view1 = new layout();
view1.addToViews('some view');
view1.renderViews(); //outputs array(1)['some view']

var view2 = new layout();
view2.renderViews(); //outputs array(0)[]

you know we fiddle the js

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

最佳答案

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

参见this related answer有关此问题的更多详细信息,因为它会影响使用原型(prototype)继承的任何类。

关于javascript - 扩展 Backbone.View 时的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13538140/

相关文章:

javascript - kinectJs 两个图像的旋转

javascript - 使用 javascript 在 Indesign 中计算字符的不同方法

Java 对象和类 - 我的代码有问题吗?

javascript - 主干提取完成后获取响应 header

JavaScript 错误 : "is not a constructor"

javascript - 调试 Backbone 应用程序 - 查看 View 名称

javascript - 当元素存在时,“classList”属性返回 null?

JavaScript:跨浏览器取消事件

java - Json 和多个用户定义的对象错误

android - 如何用另一个对象的数组来分割一个对象