Backbone默认值在属性更改时被引用

时间:2011-10-06 11:46:04

标签: javascript backbone.js

我有以下型号:

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']

我是否正确理解了这一点,如果是这样,那么设置默认值为对象的最佳方法是什么,而不会在将来的实例引用它们时随时更改它们?

如果我不清楚或误解某事,请告诉我。提前感谢您的时间。

1 个答案:

答案 0 :(得分:27)

您的“parents”属性在每个实例上都是相同的,因为它是在原型上设置的。换句话说,在构造模型时,将使用相同的对象来设置模型,因此您将获得相同的数组引用。

相反,您希望每次构建新模型时都创建一个新的默认对象。 Backbone允许您将默认值定义为函数:

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