11

私はこの2日間、これに頭をぶつけてきました。何らかの理由で、バックボーンは継承された子モデル間で親インスタンスデータを共有しています。ここに例があります:

var Base = Backbone.Model.extend({

  index : []

});

var Group = Base.extend({

  initialize : function() {
    this.index.push('from group');
  }

});


var User = Base.extend({

  initialize : function() {
    this.index.push('from user');
  }

});


var user = new User();
console.log(user.index); // ['from user']


var group = new Group();
console.log(group.index) // ['from user', 'from group']

私が探しているのは:

console.log(user.index); // ['from user']
console.log(group.index) // ['from group']

洞察はありますか?

ありがとう!マット

4

2 に答える 2

14

あなたが経験していることは、基本的に、JS が値ではなく参照によってオブジェクト (または配列) を渡す方法の副産物です。ユーザーとグループで異なるインデックスが必要な場合は、初期化関数で配列としてインスタンス化するだけです。

var Base = Backbone.Model.extend({

initialize: function() {
  this.index = [];
}


});
于 2012-04-23T00:51:05.993 に答える
6

インデックス メンバーは、Base のプロトタイプ チェーンにあるという点でクラス変数に似ており、含まれているメソッドも共有されるのと同様に、すべてのインスタンスで共有されます。インスタンス化するユーザーとグループの順序を入れ替えてみてください。インデックスには何が含まれていますか?逆ですよね?これは、extend に渡されたオブジェクトをすべて共有しているためです。

インスタンス変数にするためには、Base のコンストラクターでインスタンス化し、各サブクラスがそれぞれのコンストラクターからそのコンストラクターを呼び出すようにする必要があります。お気に入り:

var Base = Backbone.Model.extend({
    initialize: function() {
       this.index = [];
    }
});

var User = Base.extend({
    initialize: function() {
        Base.prototype.initialize.call( this );
        this.index.push('User');
    }
});

// repeat it for group.
于 2012-04-23T00:54:17.553 に答える