2011-10-06 78 views
10

我有以下型號:骨幹默認的屬性更改被引用

var Soq = Backbone.model.extend({ 
    default:{ 
     'name': 'something' 
     , 'parents': []  //array will be passed by reference to attributes hash on new object instantiation 
    } 
}); 

我是新來的JavaScript和骨幹,但看着我認爲可能發生的源頭是,當這個模型的屬性得到設爲默認值(backbone.js:137),默認值是通過引用完成的對象。這意味着,當我做這樣的事情:

var soq = new Soq; 
var parents = soq.get('parents'); 
parents.push('parent');    //changes defaults of the proto object 

var soq2 = new Soq; 
console.log(soq2.get('parents');); //will output ['parent'] 
console.log(soq2.defaults.parents); //will output ['parent'] 

我是否正確地理解這一點,如果是的話是什麼來設置的對象的默認值,而沒有讓他們隨時更改,隨時未來實例引用它們的最好方法?

讓我知道如果我不清楚或誤解的東西。在此先感謝您的時間。

回答

27

您的「父母」屬性在每個實例上都是相同的,因爲它在原型上設置。換句話說,相同的對象將被用於設置模型,當它被構造時,因此您將獲得相同的數組引用。

相反,您希望每次構建新模型時都創建一個新的默認值對象。 Backbone允許您將默認設置定義爲一種功能:

defaults: function() { 
    return { 
     name: 'something', 
     parents: [] 
    }; 
} 
+0

好的,非常感謝您的幫助! – Mitya

+1

謝謝,這太棒了。在我看到這個之前,我在'initialize()'函數中做了各種惱人的檢查。解決方案似乎很明顯:) – fiznool