日期:2014-05-16  浏览次数:20372 次

[ExtJS3.2源码每天一小时](1)ext-base.js做了什么(之二)
我们今天来继续说ext-base中到底做了什么,主要还是针对Ext这个核心对象。
1.namespace 命名空间定义 所谓命名空间,从根本上说就是对象嵌套对象
引用

namespace : function(){
            var o, d;
            //循环参数列表
            Ext.each(arguments, function(v) {
                //根据“.”将命名空间层级截开
                d = v.split(".");
                //定义最外层命名空间
                o = window[d[0]] = window[d[0]] || {};
                //生成除最外层命名空间的相关对象
                Ext.each(d.slice(1), function(v2){
                    o = o[v2] = o[v2] || {};
                });
            });
            return o;
        },

下面举个例子来详细说明:
var a = Ext.namespace("Ext.diy.xhr","JS.Util");
最终执行完后 a对应的引用 与 Util对应的引用是相同的。

下面我们来分析它的执行流程:
1.Ext.each(arguments, function(v){})遍历接收到的参数。
  上面的例子对应的就是“Ext.diy.xhr","JS.Util"这两个参数了。
2.v.split(".");对于每个参数,根据"."将层级截取出来。
3.先生成第一层的空间对象。
   o = window[d[0]] = window[d[0]] || {};
4.将第一层排外
   d.slice(1)
5.继续循环除第一层之外的其他层,嵌套生成对象。
   o = o[v2] = o[v2] || {};

通过以上的分析,我们不难得出,a最后拿到的引用是Util对象的引用。

通过命名空间的定义,形成了一系列的对象嵌套引用,在这种情况下,所有的层级访问必须带有空间层级,例如:访问diy对象,就必须为Ext.diy,访问Util对象,就必须为JS.Util等,无法单独访问diy和Util