2

さて、私は最近これに遭遇しました、そして私はそれがなぜ起こっているのか完全に理解することができません。なぜ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**​

バットマンをいじる

プレーンなバニラ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では、新しいインスタンスを作成するときに、なぜ保存状態になるのでしょうか。

4

1 に答える 1

4

拡張する場合View(または他のバックボーンクラスのいずれか)、クラスのプロトタイプを拡張することになります。プロトタイプは、クラスのすべてのインスタンス間で共有されます。これは、プロトタイプのプロパティとして設定したオブジェクトは、各インスタンスに固有ではなく、すべてのインスタンス間で共有されることを意味します。したがって、オブジェクトまたは配列であるプロパティを使用してBackboneクラスを拡張すると、すべてのインスタンス間でそのオブジェクトへの共有参照が作成されます。

この問題の詳細については、この関連する回答を参照してください。これは、プロトタイプの継承を使用するすべてのクラスに影響を与えるためです。

于 2012-11-24T04:08:11.960 に答える