Mat*_*nde 5 javascript backbone.js
我有一个基本的模型:
myTestModel = Backbone.Model.extend({
defaults: {
title: 'My Title',
config: {},
active: 1,
}
})
Run Code Online (Sandbox Code Playgroud)
没有什么特别之处,但是我注意到config选项中的值会在实例之间被记住.例如:
var test1 = new myTestModel();
test1.set('title', 'A New Title');
test1.get('config').screen_name = 'Joe';
alert( test1.get('title') ); // 'A New Title', expected.
alert( test1.get('config').screen_name ); // 'Joe', expected.
var test2 = new myTestModel();
alert( test2.get('title') ); // 'My Title', expected.
alert( test2.get('config').screen_name ); // 'Joe', NOT expected.
Run Code Online (Sandbox Code Playgroud)
那么,为什么在test2,是screen_name正在从保存test1?我怎样才能防止这种情况发生?
您偶然发现了 Javascript 中的一个陷阱,如文档中所述model.defaults:
请记住,在 JavaScript 中,对象是通过引用传递的,因此如果您包含一个对象作为默认值,它将在所有实例之间共享。相反,将默认值定义为函数。
您可以使用函数而不是哈希来设置默认值:
myTestModel = Backbone.Model.extend({
defaults: function () {
return {
title: 'My Title',
config: {},
active: 1
};
}
});
Run Code Online (Sandbox Code Playgroud)
和演示http://jsfiddle.net/nikoshr/Y7PYj/