1

我想为某个组件创建一个包含整个配置的对象。我也认为它是这样的:

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. 我想这样做是不可能的——那么最好的选择是什么?

4

1 回答 1

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 ]
};

另一种(更短的)方法是为 keys 对象添加一个额外的变量,该变量是在构造模板对象之前分配的:

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 ]
        }
    };
})();
于 2013-01-30T11:09:33.037 回答