3

私は最初の本物の JS アプリ (タワー ディフェンス ゲーム) を構築していますが、アプリの構造に少し苦労しています。グローバル名前空間を散らかさないことについて読んだので、コードをファイル (モジュール) に分割しながら、すべてのコードを 1 つのグローバル変数に保持したいと考えています。私はこれを行うことができましたが、これで正しい方法で行っているかどうかは疑問です。

私が今抱えている実際の問題は、(実際にはサブモジュールのメソッドであるコンストラクター関数を介して)「エンティティ」オブジェクトを作成すると、名前空間が予想どおり app.entity.type_1 ではなく、 app.entity.entity になることです。 .type_1

/*
** file 1 (included first in html)
*/

var APP = (function (app) {
    entity = app.entity || {};
    entity.tracker = [];

    app.init = function () {
        entity.tracker.push(new app.entity.type_1(entity.tracker.length));
        entity.tracker.push(new app.entity.type_2(entity.tracker.length));
        console.log(entity.tracker[0]);
        console.log(entity.tracker[1]);
    };

    return app;

})(APP || {});

/*
** file 2 (included after file 1 in html)
*/

APP.entity = (function (entity) {

    entity.type_1 = function (id) {
        this.type = "type 1";
        this.id = id;
    };

    entity.type_2 = function (id) {
        this.type = "type 2";
        this.id = id;
    };

    return entity;

})(APP.entity || {});

APP.init();

以下のフィドルをチェックしてください。 http://jsfiddle.net/Percept/8stFC/13/

私の質問は、なぜ「エンティティ」名前空間を繰り返すのですか?どうすればこれを回避できますか?

4

1 に答える 1

3

Chrome が認識しているクラス名について言及している場合、それは Chrome 側の最良の推測にすぎません。JavaScript には名前空間の第一級の概念がないため、JavaScript が実際に取得するすべてのコンテキストは、それを作成した関数が、その時点entity.type_1で と呼ばれていた変数に割り当てられ、その結果が に割り当てられた IIFE 内にあったということだけAPP.entityです。Chrome は、これらを連結することが最も役立つと考えました。あなたは何も悪いことをしていません.Chromeが間違った推測をしただけです. 記録のために、Firefoxはただ言うだけ[object Object]です.

于 2013-07-27T04:47:40.577 に答える