3

我正在构建我的第一个真正的 JS 应用程序(一个塔防游戏),我一直在为我的应用程序结构而苦苦挣扎。我读过关于不要乱扔全局命名空间的文章,所以我想将我的所有代码保存在一个全局变量中,同时仍然能够将我的代码拆分为文件(模块)。我已经设法做到了,但我怀疑我是否采取了正确的方式。

我现在遇到的实际问题是,当我创建“实体”对象(通过实际上是子模块的方法的构造函数)时,命名空间不是我预期的 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 认为的类名,那只是它的最佳猜测。由于 JavaScript 没有命名空间的一流概念,它真正得到的所有上下文是创建它的函数被分配给当时被称为的变量,并且该变量位于entity.type_1结果被分配给的 IIFE 中APP.entity。Chrome 认为最有帮助的做法是将它们连接起来。你没有做错任何事,只是 Chrome 猜错了。作为记录,Firefox 只是说[object Object].

于 2013-07-27T04:47:40.577 回答