3

私は JavaScript の専門家ではないので、ここで何か間違ったことをしている可能性があります。

空の配列であるデフォルトのプロパティ bars を持つ単純な Foo Backbone モデルがあります。モデルの 2 つのインスタンスを作成します。最初のモデルに「a」と「b」を追加し、2 番目のモデルに「c」と「d」を追加します。console.log() でバーの内容を出力すると、両方のインスタンスが同じオブジェクトのように見えます。

JsFiddle: http://jsfiddle.net/P7qsz/

コード:

var Foo = Backbone.Model.extend({
    defaults: {
        bars: []
    }
});

var foo = new Foo();
foo.get("bars").push("a");
foo.get("bars").push("b");
console.log(foo.get("bars"));

var foo2 = new Foo();
foo2.get("bars").push("c");
foo2.get("bars").push("d");
console.log(foo2.get("bars"));

コンソールに次のように表示されます。

["a", "b", "c", "d"]
["a", "b", "c", "d"]

私は何を間違っていますか?

4

2 に答える 2

5

JavaScript では、配列 (およびオブジェクト) は参照として渡されます。

ここでは、各モデルに同じ配列参照を割り当てました。

これを修正するには、毎回新しい配列を割り当てる必要があります。

Backbone.Model.extend({
  initialize: function() {
    this.set("bars", []); // Here we set a new array
  }
});
于 2013-06-19T15:33:40.710 に答える
4

それらはシングルトンではありません。

console.log(foo === foo2) //false

何が起こるかというと、両方のインスタンスがデフォルト オブジェクトを共有し、配列への参照を持っています。したがって、最終的に、このモデルのすべてのインスタンスは同じ配列を持ちます。

配列とオブジェクトは、デフォルト オブジェクトで宣言しないでください。コンストラクターで宣言する必要があります。

var Foo = Backbone.Model.extend({
    initialize: function () {
        this.set("bars", []);
    },
    defaults: {
        bars: null
    }
});
于 2013-06-19T15:39:19.010 に答える