[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