在子模块中使用构造函数时出现意外的“双”命名空间

时间:2013-07-27 04:36:36

标签: javascript

我正在构建我的第一个真正的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/

我的问题是,为什么它会重复“实体”命名空间,我该如何避免这种情况?

1 个答案:

答案 0 :(得分:3)

如果您指的是Chrome认为的类名称,那只是最好的猜测。由于JavaScript没有一流的命名空间概念,所以它真正得到的所有上下文都是创建它的函数被分配给一个名为entity.type_1的变量,而那个是在IIFE中的结果。被分配到APP.entity。 Chrome认为最有用的方法是连接它们。你没有做错任何事,只是Chrome做了一个糟糕的猜测。为了记录,Firefox只是说[object Object]