我正在构建我的第一个真正的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/
我的问题是,为什么它会重复“实体”命名空间,我该如何避免这种情况?
答案 0 :(得分:3)
如果您指的是Chrome认为的类名称,那只是最好的猜测。由于JavaScript没有一流的命名空间概念,所以它真正得到的所有上下文都是创建它的函数被分配给一个名为entity.type_1
的变量,而那个是在IIFE中的结果。被分配到APP.entity
。 Chrome认为最有用的方法是连接它们。你没有做错任何事,只是Chrome做了一个糟糕的猜测。为了记录,Firefox只是说[object Object]
。