扩展 Backbone.View 时的奇怪行为



好吧,我最近遇到了这个问题,我不太清楚为什么会发生这种情况。有人可以解释为什么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!**

斯菲德尔

这工作正常:

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**​

摆弄我蝙蝠侠

普通的 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)[]

你知道我们在摆弄 JS

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

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

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

最新更新