从零开始编辑一个java储存模型

    一个框架想要能支撑较大的应用,首先要考虑怎么做模块化。有了内核和模块加载系统,外围的模块就可以一个一个增加。不同的JavaScript框架,实现模块化方式各有不同,我们来选择一种比较优雅的方式作个讲解。

    先问个问题:我们做模块系统的目的是什么?如果觉得这个问题难以回答,可以从反面来考虑:假如不做模块系统,有什么样的坏处?

    我们经历过比较粗放、混乱的前端开发阶段,页面里充满了全局变量,全局函数。那时候要复用js文件,就是把某些js函数放到一个文件里,然后让多个页面都来引用。

    考虑到一个页面可以引用多个这样的js,这些js互相又不知道别人里面写了什么,很容易造成命名的冲突,而产生这种冲突的时候,又没有哪里能够提示出来。所以我们要有一种办法,把作用域比较好地隔开。

    JavaScript这种语言比较奇怪,奇怪在哪里呢,它的现有版本里没packageclass,要是有,我们也没必要来考虑什么自己做模块化了。那它是要用什么东西来隔绝作用域呢?

    在很多传统高级语言里,变量作用域的边界是大括号,在{}里面定义的变量,作用域不会传到外面去,但我们的JavaScript大人不是这样的,他的边界是function。所以我们这段代码,i仍然能打出值:

for (var i=0; i<5; i++) {

    //do something}

alert(i);

    那么,我们只能选用function做变量的容器,把每个模块封装到一个function里。现在问题又来了,这个function本身的作用域是全局的,怎么办?我们想不到办法,拔剑四顾心茫然。

    我们有没有什么可参照的东西呢?这时候,脑海中一群语言飘过: C语言飘过:我不是面向对象语言哦~不需要像你这么组织哦~”死开!” Java飘过:我是纯面向对象语言哦,连main都要在类中哦,编译的时候通过装箱清单指定入口哦~”死开!” C++飘过:我也是纯面向对象语言哦,等等,C++是纯面向对象的语言吗?你的main是什么???main是特例,不在任何类中!

    啊,我们发现了什么,既然无法避免全局的作用域,那与其让100function都全局,不如只让一个来全局,其他的都由它管理。

    本来我们打算自己当上帝的,现在只好改行先当个工商局长。你想开店吗?先来注册,不然封杀你!于是良民们纷纷来注册。店名叫什么,从哪进货,卖什么的,一一登记在案,为了方便下面的讨论,我们连进货的过程都让工商局管理起来。名,指的就是这里的模块名,从哪里进货,代表它依赖什么其他模块,卖什么,表示它对外提供一些什么特性。

    好了,考虑到我们的这个注册管理机构是个全局作用域,我们还得把它挂在window上作为属性,然后再用一个function隔离出来,要不然,别人也定义一个同名的,就把我们覆盖掉了。

(function() {

    window.thin = {

        define: function(name, dependencies, factory) {

            //register a module

        }

    };})();

    在这个module方法内部,应当怎么去实现呢?我们的module应当有一个地方存储,但存储是要在工商局内部的,不是随便什么人都可以看到的,所以,这个存储结构也放在工商局同样的作用域里。

    用什么结构去存储呢?工商局备案的时候,店名不能跟已有的重复,所以我们发现这是用map的很好场景,考虑到JavaScript语言层面没有map,我们弄个Object来存。

(function() {

    var moduleMap = {};

    window.thin = {

        define: function(name, dependencies, factory) {

            if (!moduleMap[name]) {

                var module = {

                    name: name,

                    dependencies: dependencies,

                    factory: factory

                };

                moduleMap[name] = module;

            }

            return moduleMap[name];

        }

    };})();

    现在,模块的存储结构就搞好了。

 

the end

评论(0)