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方法的参数,然后用点号分割成数组,依次把空对象递归赋值进去,上面就是系统内建的命名空间
从代码可以看出,如果我们传入的字符串参数是以"."分割的,那么将会创建多个对象,比如:
则会创建2个对象,相当于执行了下面的代码:
system.corp = {};
这样,我们在自定义类的时候就能这样使用:
system.corp.ManageCorp = function() {
//dosomething
}
如果还想定义一个同名的类,那么可以就使用不同的namespace来区分,这样2个类就不会冲突了:
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不是对象。
相关推荐
5. `Ext.namespace( String namespace1, String namespace2, String etc )`: 它创建命名空间,有助于组织代码,避免全局变量污染。例如,`Ext.namespace('MyApp.models', 'MyApp.views')`会创建`MyApp.models`和`...
7. `Ext.namespace(String namespace1, String namespace2, String etc)`: 用于创建JavaScript命名空间,帮助组织和避免全局变量污染。例如,`Ext.namespace('MyApp.models', 'MyApp.views')`可以创建`MyApp.models`...
ExtJS 中的面向对象编程是通过 Ext.namespace() 函数来实现的,例如 Ext.namespace("Ext.cc");。 ExtJS 中的类继承是通过 prototype 属性来实现的,例如 Ext.cc.Class2.prototype = new Ext.cc.Class1();。 ExtJS 中...
6.2.8 Ext.namespace() 6.2.9 Ext.each() 6.2.1 0Ext.apply() 6.2.1 1Ext.encode() 6.2.1 2Ext.htmlDecode() 6.2.1 3Ext.typeOf() 6.3 Ext.core.DomHelper 6.3.1 Ext.core.DomHepler.append() ...
- `Ext.namespace()`: 创建命名空间。 - `Ext.override()`: 用于扩展或修改已有的类方法。 - `Ext.query()`: 类似于jQuery的选择器,用于选取DOM元素。 - `Ext.removeNode()`: 删除DOM节点。 - `Ext.toArray()`...
8. `Ext.namespace(string namespace1, string namespace2, string etc)`:创建命名空间,帮助组织代码,防止命名冲突。 9. `Ext.each(Array/NodeList/Mixed array, Function fn, object scope)`:遍历数组或...
- **命名空间**:使用`Ext.namespace`定义命名空间,例如`Ext.namespace("Ext.cc")`。 - **对象创建**:可以通过传统的JavaScript语法创建对象,然后利用`Ext.apply`方法添加额外的属性和方法。 ```javascript Ext...
通过`Ext.namespace`可以创建命名空间,类似于Java的包。类的创建和继承则可以通过JavaScript的原型链实现,或者使用ExtJS提供的`Ext.extend`方法。此外,`Ext.apply`可以用于向对象动态添加属性和方法。 获取界面...
7. **Ext.namespace()**: 创建命名空间,用于组织和隔离代码,避免全局变量冲突。例如,你可以创建`Company`、`MyNS.mydata`和`Data.format.string`这样的命名空间。 8. **Ext.urlEncode()** 和 **Ext.urlDecode()*...
`Ext.namespace`是Extjs中的一个方法,用于定义命名空间。命名空间是一种组织代码的方式,避免全局变量污染,并允许在不同模块间共享资源。例如,在代码中出现的`Ext.namespace('com.faceye.layout');`就是创建了一...
Ext.namespace("Mis.Ext"); /** * CRUD面板基类 */ Mis.Ext.CrudPanel = Ext.extend(Ext.Panel, { // ... 具体实现细节省略 }); ``` 要使用这个CRUD面板,需要进一步继承并实现特定的需求,比如文中给出的例子...
1. **命名空间**:使用`Ext.namespace`创建JavaScript命名空间,避免全局变量污染。 2. **类定义**:可以使用传统的JavaScript构造函数方式定义类,也可以使用Ext的`Ext.extend`方法实现继承。 3. **对象扩展**:`...
8. **Ext.namespace**: 创建命名空间,有助于避免全局变量污染,用于组织代码结构。 9. **Ext.each**: 遍历数组或NodeList,执行提供的回调函数,可以指定作用域。 10. **Ext.apply**: 将一个对象的属性复制到另一...
- 使用`Ext.namespace()`定义命名空间,例如`CjExt.test`,以避免全局变量冲突。 - `CjExt.test.Person`类的创建展示了EXT构造函数和`Ext.apply()`方法的应用,用于初始化对象属性。 - 类的继承在EXT中通过`Ext....
你可以使用`Ext.namespace`来创建命名空间,避免全局变量污染。创建类时,虽然ExtJS提供了一套完整的类系统,但也可以选择使用JavaScript原生语法。继承机制可以通过直接赋值原型链实现,或者使用`Ext.extend`方法。...