你如何解释这个对象文字?

时间:2014-04-01 13:16:27

标签: javascript object-literal

我是Javascript Object Literal的新手,我在理解这种逻辑背后的机制时遇到了问题,因此,我不知道在Google或SO中搜索正确的关键字。

以下是我的问题的一个例子:

var dialog = {
    open: function(x){
        console.log(JSON.stringify(x))
    },
    type: {
        settings: {
            controller: '',
            click: false,
            clas: ''
        },
        foo: function(){
            this.settings.controller = 'Foo controller'
            this.settings.clas = 'Foo class'
            dialog.open(this.settings)
        },
        bar: function(){
            this.settings.click = true
            dialog.open(this.settings)
        }
     }
}

这是我的问题:

//A
dialog.type.foo();
//B
dialog.type.bar();
//C
dialog.type.foo();

为什么当我运行//C时,dialog.type.settings仍然保留foo的值? 如何默认返回dialog.type.settings

2 个答案:

答案 0 :(得分:2)

您只有一个对象可供使用,因此您在之前步骤中更改的任何内容都是"随身携带"直到你明确地改变它们。

每次我建议使用每次都返回一个新实例的函数并隐藏settingsopen属性时,要使用新的对话框对象:

function dialog()
{
    var settings = {
        controller: '',
        click: false,
        clas: ''
    },
    open = function(x) {
        console.log(JSON.stringify(x));
    };

    return {
        type: {
            foo: function() {
                settings.controller = 'Foo controller';
                settings.clas = 'Foo class';
                open(settings);
            },
            bar: function() {
                settings.click = true;
                open(settings);
            }
        }
    };
}

然后:

var a = dialog();
a.type.foo();

var b = dialog();
b.type.bar();

var c = dialog();
c.type.foo();

Demo

它避免了在各种上下文中使用this时可能遇到的问题,因为settingsopen始终在您从{返回的API的范围内{1}}功能。

答案 1 :(得分:1)

您的“foo”功能明确且有意地更改了这些“设置”属性的值。毕竟,只有一个“设置”对象。如果要还原值,则必须编写一个函数来执行此操作。