2011-10-06 38 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