Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/471.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 主干线“;“记住”;属性中的值_Javascript_Backbone.js - Fatal编程技术网

Javascript 主干线“;“记住”;属性中的值

Javascript 主干线“;“记住”;属性中的值,javascript,backbone.js,Javascript,Backbone.js,我有一个基本模型: myTestModel = Backbone.Model.extend({ defaults: { title: 'My Title', config: {}, active: 1, } }) 没有什么特别的,但是我注意到config选项中的值在实例之间被记住。例如: var test1 = new myTestModel(); test1.set('title', 'A New Title'); test1.

我有一个基本模型:

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.

那么,为什么在
test2
中,
屏幕名称从
test1
中保留下来?如何防止这种情况发生?

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

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

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

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

当然还有一个演示。现在看来,这是有道理的。谢谢。可能重复(至少相同的基本问题和解决方案)。