`
一只落单的程序猿
  • 浏览: 447 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

Ext.nameSpace 命名空间解析

ext 
阅读更多
之前做项目看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]
分享到:
评论

相关推荐

    JAVA_API1.6文档(中文)

    javax.xml.namespace XML 名称空间处理。 javax.xml.parsers 提供允许处理 XML 文档的类。 javax.xml.soap 提供用于创建和构建 SOAP 消息的 API。 javax.xml.stream javax.xml.stream.events javax.xml.stream....

    [Java参考文档].JDK_API 1.6

    javax.xml.namespace XML 名称空间处理。 javax.xml.parsers 提供允许处理 XML 文档的类。 javax.xml.soap 提供用于创建和构建 SOAP 消息的 API。 javax.xml.stream javax.xml.stream.events javax.xml.stream....

    [Java参考文档]

    javax.xml.namespace XML 名称空间处理。 javax.xml.parsers 提供允许处理 XML 文档的类。 javax.xml.soap 提供用于创建和构建 SOAP 消息的 API。 javax.xml.stream javax.xml.stream.events javax.xml.stream....

    JavaAPI中文chm文档 part2

    javax.xml.namespace XML 名称空间处理。 javax.xml.parsers 提供允许处理 XML 文档的类。 javax.xml.soap 提供用于创建和构建 SOAP 消息的 API。 javax.xml.stream javax.xml.stream.events javax.xml.stream....

    java api最新7.0

    javax.xml.namespace XML 名称空间处理。 javax.xml.parsers 提供允许处理 XML 文档的类。 javax.xml.soap 提供用于创建和构建 SOAP 消息的 API。 javax.xml.stream javax.xml.stream.events javax.xml.stream.util ...

    JavaAPI1.6中文chm文档 part1

    javax.xml.namespace XML 名称空间处理。 javax.xml.parsers 提供允许处理 XML 文档的类。 javax.xml.soap 提供用于创建和构建 SOAP 消息的 API。 javax.xml.stream javax.xml.stream.events javax.xml.stream....

    Java 1.6 API 中文 New

    javax.xml.namespace XML 名称空间处理。 javax.xml.parsers 提供允许处理 XML 文档的类。 javax.xml.soap 提供用于创建和构建 SOAP 消息的 API。 javax.xml.stream javax.xml.stream.events javax.xml.stream.util ...

Global site tag (gtag.js) - Google Analytics