これはBackboneのextendメソッドではなく、JavaScript自体の問題(または動作)であることは理解していますが、それを回避するための最良の戦略は何かを知りたい.
コードに入れましょう:
var MyModel = Backbone.Model.extend({
value: 0,
values: []
});
var myFirstModel = new MyModel();
myFirstModel.value // 0, as expected
myFirstModel.values // [], as expected
var mySecondModel = new MyModel();
mySecondModel.value = 2;
mySecondModel.values.push(2)
mySecondModel.value // 2, as expected
mySecondModel.values // [2], as expected
myFirstModel.value // 0, as expected
myFirstModel.values // [2], ... WAT!!!
問題は、mySecondModel.values に新しい値を割り当てていないことだと理解しています。プロトタイプにある値の変数、つまり MyModel.prototype.values を操作しているだけです (他のオブジェクトと同じ問題です。コース)
しかし、それを台無しにするのは非常に簡単です。最も直感的なことは、それらをインスタンス変数として考えることであり、すべてのインスタンスに共通の変数 (クラスベース言語の静的変数またはクラス変数) ではありません。
これまでのところ、私が見つけた一般的な解決策は、次のように、初期化メソッドですべての変数を初期化することです。
var MyModel = Backbone.Model.extend({
initialize: function() {
this.value = 0;
this.values = [];
}
});
そうすれば、すべてが期待どおりに機能し、単純な値 (this.value など) には必要ありませんが、すべての場合にこの原則に固執する方がずっと簡単だと思います。
この問題に対するより良い(よりエレガントで明確な)解決策があるかどうか疑問に思っています