`
haray
  • 浏览: 5196 次
  • 性别: Icon_minigender_1
  • 来自: 昆明
最近访客 更多访客>>
文章分类
社区版块
存档分类

Ext.namespace 命名空间的解析

阅读更多
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不是对象。
宠辱不惊,闲看庭前花开花落;去留无意,漫随天外云卷云舒。
分享到:
评论

相关推荐

    Ext.js核心函数详解.docx

    5. `Ext.namespace( String namespace1, String namespace2, String etc )`: 它创建命名空间,有助于组织代码,避免全局变量污染。例如,`Ext.namespace('MyApp.models', 'MyApp.views')`会创建`MyApp.models`和`...

    Ext.js核心函数详解.pdf

    7. **Ext.namespace(String namespace1, String namespace2, String etc)**:创建命名空间,有助于组织和避免全局变量污染。例如,`Ext.namespace('MyApp.models', 'MyApp.views')`可以创建`MyApp.models`和`MyApp....

    ExtJs-API中的一些重要的详解文档

    7. **Ext.namespace()**: 创建命名空间,用于组织和隔离代码,避免全局变量冲突。例如,你可以创建`Company`、`MyNS.mydata`和`Data.format.string`这样的命名空间。 8. **Ext.urlEncode()** 和 **Ext.urlDecode()*...

    Extjs 常用属性

    `Ext.namespace`是Extjs中的一个方法,用于定义命名空间。命名空间是一种组织代码的方式,避免全局变量污染,并允许在不同模块间共享资源。例如,在代码中出现的`Ext.namespace('com.faceye.layout');`就是创建了一...

    EXT核心API详解.doc

    例如,`Ext.namespace('Company.data')`创建了Company和Company.data两个命名空间。 15. **num**: 将给定值转换为数字,如果无法转换,将返回默认值。默认值不一定是数字,只要能被JavaScript解析为数字即可。 EXT...

    EXT核心API详解

    - `namespace1`, `namespace2`, `etc`:命名空间路径的各个部分。 - **示例**: ```javascript Ext.namespace('MyApp', 'MyApp.util'); MyApp.MyClass = function () {}; // 创建MyApp.MyClass ``` ##### 19. ...

    extjs gridpanel例子和简单应用

    这里首先使用`Ext.namespace`函数来声明一个名为`test.grid`的命名空间。这样做的目的是为了组织代码结构,避免变量名冲突。 2. **创建HttpProxy** ```javascript var proxy_url = 'data.jsp'; var _proxy = ...

    Extjs中文教程

    - 使用`Ext.namespace`方法来定义命名空间。 - **Extjs OOP** - Extjs提供了一套面向对象的编程模型,支持类的继承、封装等特性。 - 通过`Ext.extend`和`Ext.override`方法可以实现类的继承和重写。 - **配置...

    myExt

    文件中还涉及到了命名空间的使用,通过`Ext.namespace('myNameSpace')`创建了`myNameSpace`命名空间。命名空间是一种避免全局变量污染的方法,特别是在大型项目中,可以有效地组织和管理代码,防止不同模块间命名...

    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....

    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....

    解析linux根文件系统的挂载过程.pdf

    接着,内核分配一个新的命名空间(mnt_namespace),并将rootfs挂载到该命名空间的根目录上,最后设置当前进程的根目录和当前目录为"/"。 挂载的具体文件系统(如ext4、xfs等)通常是在内核初始化之后,通过设备...

    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 ...

    web 个人总价注意开发规范

    根据给定的文件信息,以下是对“Web个人总价注意开发规范”的详细解析,涉及编码标准、文件命名、页面布局、国际化、命名空间定义以及特定框架的使用等方面。 ### 编码标准与命名约定 #### 常量命名 全部使用大写...

Global site tag (gtag.js) - Google Analytics