1

特定のコンポーネントの構成全体を含む 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

最善の解決策は、最初に 1 つのオブジェクトのみを作成してから、さらにプロパティを順番に追加することです。

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

別の (より短い) メソッドは、テンプレート オブジェクトの構築前に割り当てられるキー オブジェクトの追加の変数です。

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 に答える