主干“记住”属性中的值

Backbone "remembering" values in properties

本文关键字:属性 记住 主干      更新时间:2023-09-26

我有一个基本模型:

myTestModel = Backbone.Model.extend({
    defaults: {
        title: 'My Title',
        config: {},
        active: 1,
    }
})

那里没有什么特别的,但是我注意到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.

那么,为什么在test2screen_name被保存下来,免受test1?如何防止这种情况发生?

您偶然发现了 Javascript 中的一个陷阱,如 model.defaults 文档中所述:

请记住,在 JavaScript 中,对象是通过引用传递的,所以如果 您包含一个对象作为默认值,它将在所有人之间共享 实例。相反,将默认值定义为函数。

您可以使用函数而不是哈希来设置默认值:

myTestModel = Backbone.Model.extend({
    defaults: function () {
        return {
            title: 'My Title',
            config: {},
            active: 1
        };
    }
});

还有一个演示 http://jsfiddle.net/nikoshr/Y7PYj/