javascript - 你如何解释这个对象字面量?

标签 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

最佳答案

您只有一个对象可以使用,因此您在前面的步骤中更改的任何内容都将“保留”,直到您明确更改它们。

要每次都使用一个新的对话框对象,我建议使用一个函数,该函数每次都返回一个新实例并隐藏 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 始终在范围内您从 dialog() 函数返回的 API。

关于javascript - 你如何解释这个对象字面量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22787074/

相关文章:

php - javascript php 编辑器

javascript - 对象字面量方法的范围

javascript - 无法在对象文字中使用 jQuery 函数

javascript - 固定按钮位于 html 中 slider 后面

javascript - 将html元素简化为js

java - Eclipse无法查看类文件

Javascript 方法不是函数

javascript - 模板字符串作为对象属性名称

javascript - 对象字面量 vs 构造函数+原型(prototype)

javascript - 避免在 React 中由对象文字 : how to do with variables in the object? 引起的重新渲染