JavaScript中的嵌套对象,最佳实践

43

我希望了解在javascript中创建嵌套对象的正确方法。我想要一个名为"defaultsettings"的基础对象,它应该有两个属性(对象类型):ajaxsettings和uisettings。我知道我可以写出像下面这样的东西:

var defaultsettings = new Object();
var ajaxsettings = new Object();

defaultsettings.ajaxsettings = ajaxsettings.. etc.

但我想知道的是如何以这种方式输入(我认为这是更正确的方法):

var defaultsettings = { 
    var ajaxsettings = { ... }
};

我想你已经理解了。谢谢!


10
关于最佳实践,应使用 {} 替代 new Object() - Šime Vidas
3个回答

88

如果你事先知道设置,你可以在一条语句中定义它:

var defaultsettings = {
                        ajaxsettings : { "ak1" : "v1", "ak2" : "v2", etc. },
                        uisettings : { "ui1" : "v1", "ui22" : "v2", etc }
                      };

如果事先不知道值,您可以只定义顶层对象,然后添加属性:

var defaultsettings = { };
defaultsettings["ajaxsettings"] = {};
defaultsettings["ajaxsettings"]["somekey"] = "some value";

或者在这两种方法之间取个折中,用嵌套的空对象作为属性定义顶层,然后向这些嵌套的对象添加属性:

var defaultsettings = {
                        ajaxsettings : {  },
                        uisettings : {  }
                      };

defaultsettings["ajaxsettings"]["somekey"] = "some value";
defaultsettings["uisettings"]["somekey"] = "some value";

使用上述技术可以嵌套得越深越好,在方括号中的任何字符串文字的位置都可以使用变量:

var keyname = "ajaxsettings";
var defaultsettings = {};
defaultsettings[keyname] = {};
defaultsettings[keyname]["some key"] = "some value";
请注意,您不能在{ }的字面量语法中使用变量作为键名。

2
我想 defaultsettings["ajaxsettings"]["somekey"] 相当于 defaultsettings.ajaxsettings.somekey ? - Johan
2
是的。只要键名遵循有效的JS标识符名称规则,即不以数字开头,不是JS保留字,没有空格等,就可以使用点表示法。(如果使用方括号语法,则允许所有这些内容,实际上,我的最后一个示例中的键名确实有一个空格,这是纯属偶然。) - nnnnnn
@ujwaldhakal - .push() 是一个数组方法,你不能在普通对象上使用它。但是我回答中展示的代码展示了如何通过添加对象和然后向它们添加属性来获得类似 { 'a' : {'key':'value'}, 'b' : {'key':'value'} } 的东西。 - nnnnnn
1
请注意,在ES6中,您现在可以使用对象字面量表示法从变量声明键,例如 { [myVariable]: "myValue"} - Daniel Zendejas
1
@sigmapi13 - keyname 是一个变量,不应该在它周围加引号。 - nnnnnn
显示剩余3条评论

12
var defaultsettings = {
    ajaxsettings: {
        ...
    },
    uisettings: {
        ...
    }
};

1
我需要在defaultsettings之外声明ajaxsettings为一个新对象吗? - Johan
不,就按照那样构建。 - Niet the Dark Absol
不,所有内容都可以这样声明。如果您有另一个要设置为ajaxsettings的对象,只需在:的另一侧列出它,而不是{}。请记住,在列表中的最后一个属性之外,所有属性后面都要加逗号。 - Brian

4
var defaultSettings = {
    ajaxsettings: {},
    uisettings: {}
};

看看这个网站:http://www.json.org/ 此外,您可以在浏览器中调用JSON.stringify()函数来查看json格式。你需要在控制台或测试页面中执行此操作。

关于 JSON.stringify(),我想它不包含在 jQuery 中,对吗? - Johan
很遗憾有人投了反对票,但没有解释为什么(不是我),但需要注意的是JS对象字面量和JSON是两个不同的东西。(具有讽刺意味的是,你答案中的示例代码并不是有效的JSON格式。) - nnnnnn
我猜我错误地将两者视为相同,但我认为JSON是Javascript对象的有效表示,只是它在一个字符串中。了解正确的JSON符号将使OP编写正确的对象文字成为可能。我知道我写的不是JSON,但就对象文字而言,它是正确的,不是吗? - Brian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接