我想创建一个包含特定组件的整个配置的对象。我也会这样说谎:
var ObjectConfig = {
fieldKeys : {
name: "Obj. name",
state: "Obj. state",
color: "Obj. color"
},
templates : {
basicTemplate : [ ObjectConfig.fieldKeys.name, ObjectConfig.fieldKeys.state ],
altTemplate : [ ObjectConfig.fieldKeys.name, ObjectConfig.fieldKeys.color ]
}
}
但这是以正确的方式做到的 - 它不起作用。我怎样才能实现目标?
编辑:
对不起,我是手工编写的,这就是语法错误的来源。现在这是正确的。我得到的错误是Uncaught TypeError: Cannot read property 'fieldKeys' of undefined
。我想这样做是不可能的 - 那么最好的选择是什么呢?
答案 0 :(得分:2)
您的问题是该对象是在 之前从文本构造的,它被分配给ObjectConfig
变量。因此,访问文字内的ObjectConfig.fieldKeys
会导致错误。
最佳解决方案是仅构造第一个对象,然后按顺序添加其他属性:
var ObjectConfig = {
fieldKeys: {
name: "Obj. name",
state: "Obj. state",
color: "Obj. color"
}
};
ObjectConfig.templates = {
basicTemplate: [ ObjectConfig.fieldKeys.name, ObjectConfig.fieldKeys.state ],
altTemplate: [ ObjectConfig.fieldKeys.name, ObjectConfig.fieldKeys.color ]
};
另一个(更短的)方法是key对象的额外变量,它在构造模板对象之前分配:
var keys, ObjectConfig = {
fieldKeys: keys = {
name: "Obj. name",
state: "Obj. state",
color: "Obj. color"
},
templates: {
basicTemplate: [ keys.name, keys.state ],
altTemplate: [ keys.name, keys.color ]
}
};
要在全局范围内解决额外变量,可以使用IEFE。一个更具可读性的解决方案可能如下所示:
var ObjectConfig = (function() {
var keys = {
name: "Obj. name",
state: "Obj. state",
color: "Obj. color"
};
return {
fieldKeys: keys,
templates: {
basicTemplate: [ keys.name, keys.state ],
altTemplate: [ keys.name, keys.color ]
}
};
})();