Ext.nameSpace 命名空间解析

之前做项目看Ext3.x的时候,觉得会用就好了,没有深入去理解。最近研究Sencha又遇到这个疑惑。于是上网搜了很多相关的资料,在此总结一下。

1.

Ext.namespace方法,该方法的作用是把传入的参数转换成对象.使用该方法的目的主要在于可以区分类名相同的类,这有点和java中的package作用类似.让我们先看下源码:


1 namespace : function(){ 
2        var a=arguments, o=null, i, j, d, rt; 
3        for (i=0; i<a.length; ++i) {
4                d=a[i].split(".");
5                rt = d[0];
6                eval(‘if (typeof ‘ + rt + ‘ == "undefined"){‘ + rt + ‘ = {};} o = ‘ + rt + ‘;‘); 
7                for (j=1; j<d.length; ++j) {
8                     o[d[j]]=o[d[j]] || {};
9                     o=o[d[j]];
10                }
11        }
12 ,
13 ……
14 ……
15 Ext.ns = Ext.namespace;
16 ……
17  ……
18 Ext.ns("Ext", "Ext.util", "Ext.grid", "Ext.dd", "Ext.tree", "Ext.data", "Ext.form", "Ext.menu", "Ext.state", "Ext.lib", "Ext.layout", "Ext.app", "Ext.ux"); 首先通过arguments得到namespace方法的参数,然后用点号分割成数组,依次把空对象递归赋值进去,上面就是系统内建的命名空间

从代码可以看出,如果我们传入的字符串参数是以"."分割的,那么将会创建多个对象,比如:

Ext.namespace('system.corp');
则会创建2个对象,相当于执行了下面的代码:

system = {};
system.corp = {};
这样,我们在自定义类的时候就能这样使用:

Ext.namespace('system.corp');

system.corp.ManageCorp = function() {
    //dosomething
}
如果还想定义一个同名的类,那么可以就使用不同的namespace来区分,这样2个类就不会冲突了:

Ext.namespace('system.admin');

system.admin.ManageCorp = function() {
    //dosomething
}
此外,注意源码中"eval"方法的使用,如果有需要可以采用这种方式来解决问题。

2.

对于java中的包,我们都认为主要是为了类名重复而引入的一种管理类的方法。同样,因为js定义的类太多,难免会定义重复的类名。特别是在今天这个需要共同协作完成项目的世界里。Ext.namespace正是为此而生。

Ext.namespace('com.company');
就是定义了一个com.company的包。

com.company.ClassA = function(){};就是定义了com.company包下面的一个Class。既然定义了包,为何还要写Ext.namespace('com.company')?直接写com.company.ClassA = function(){}不行吗?com.company.ClassA不就是一个变量名称吗?哪儿来的包。后来经实践,javascript的变量名称是不准包括'.'的。因此,直接写com.company.ClassA = function(){};在语法上是不正确的。

查看ext的官方解释,如果我们不用Ext.namespace的话,创建命名空间应该这样。

if (!App) App = {};
if (!App.form) App.form = {};
if (!App.data) App.data = {};

而 Ext.namespace('App', 'App.form', 'App.data');
则跟上面3句话的作用是一样的。

可以看出,这个包其本质上是一个对象,一个window的变量。也就是说,我们的包是一个分层次的对象。如com.company,应该解释成com对象的一个属性company。如果定义这个包下面的类,则应该把这个类添加到com对象的属性company的属性里面。

3.

Ext.namespace("webbook.author.comboBox")
JS中相当于创建了三个对象: (类似于JAVA包)
webbook={};
webbook.author={};
webbook.author.comboBox={};


对像赋值:
webbook=["t","v"];
webbook.author.comboBox=[["t1","v1"],["t2","v2"]];
webbook.author.comboBox.level=[....]            //定义"对象.变量"赋值,但不能webbook.author.comboBox.level.name=[..],因为level不是对象。

[size=xx-small][/size]

你可能感兴趣的:(ext)