2013-06-19 55 views
3

我不是JavaScript專家,所以我可能在這裏做錯了什麼。骨幹模型是單身人士嗎?

我有一個簡單的Foo Backbone模型,其默認屬性欄是一個空數組。我創建了兩個模型實例。我在第一個模型中添加了「a」和「b」,在第二個模型中添加了「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"] 

我在做什麼錯?

回答

5

在javascript中,數組(和對象)作爲引用傳遞。

在這裏,您爲每個模型分配了相同的數組引用。

要修復它,您需要每次分配一個新的數組。

Backbone.Model.extend({ 
    initialize: function() { 
    this.set("bars", []); // Here we set a new array 
    } 
}); 
4

他們不是單身人士。

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

會發生什麼是兩個實例共享默認對象,並且它有一個refenrece數組。所以最後,這個模型的所有實例都有相同的數組。

數組和對象不應該在默認對象中聲明,它應該在構造函數中。

var Foo = Backbone.Model.extend({ 
    initialize: function() { 
     this.set("bars", []); 
    }, 
    defaults: { 
     bars: null 
    } 
}); 
+1

_Arrays和OBJETS永遠都不應該在默認對象中聲明,它應該是在constructor._實際上,[骨幹文檔(http://backbonejs.org/#Model-defaults)建議使用函數在默認情況下返回一個新的數組/對象。 [小提琴](http://jsfiddle.net/P7qsz/1/) – steveax

+0

你說得對。但是,不向默認添加obj的權限適用於所有JS,而不僅適用於骨幹。 – Kaizo