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

Javascript “意外”;“双”字;在子模块中使用构造函数时的命名空间,javascript,Javascript,我正在构建我的第一个真正的JS应用程序(一个塔防游戏),我一直在为我的应用程序结构挣扎。我已经读过关于不要乱丢全局名称空间的文章,所以我希望将所有代码都保存在一个全局变量中,同时仍然能够将代码拆分为文件(模块)。我已经设法做到了这一点,但我怀疑我是否走上了正确的道路 我现在遇到的实际问题是,当我创建“实体”对象时(通过构造函数,它实际上是子模块的一个方法),名称空间不是我所期望的app.entity.type_1,而是app.entity.entity.type_1 /* ** file 1 (

我正在构建我的第一个真正的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();
请看下面的小提琴。


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

如果你指的是Chrome认为的类名,那只是它的最佳猜测。由于JavaScript没有一流的名称空间概念,它真正得到的所有上下文是,创建它的函数被分配给了一个变量,该变量在当时被称为
entity.type_1
,该变量位于一个iLife中,其结果被分配给
APP.entity
。Chrome认为最有用的方法是将这些连接起来。你没有做错什么,只是Chrome做了一个错误的猜测。作为记录,Firefox只说了
[object object]

谢谢你的回答,我花了4个小时寻找chrome为什么这么做的原因(应该检查其他浏览器)。有什么方法可以“覆盖”这个吗?我正在考虑将新返回的实体对象克隆到我的主应用程序iLife中的一个新对象中,这样我应该能够控制名称空间,但为了获得正确的命名,它似乎有点过头了。