没有眼泪
Don't Cry!
posts - 13,comments - 44,trackbacks - 0
        Ext2.0中,Ext类有个namespace方法,该方法的作用是把传入的参数转换成对象.使用该方法的目的主要在于可以区分类名相同的类,这有点和java中的package作用类似.让我们先看下源码:
namespace : function(){
    
var a=arguments, o=null, i, j, d, rt;
    
for (i=0; i<a.length; ++i) {
        d
=a[i].split(".");
        rt 
= d[0];
            eval('
if (typeof ' + rt + ' == "undefined"){' + rt + ' = {};} o = ' + rt + ';');
        
for (j=1; j<d.length; ++j) {
            o[d[j]]
=o[d[j]] || {};
               o
=o[d[j]];
        }

    }

}
从代码可以看出,如果我们传入的字符串参数是以"."分割的,那么将会创建多个对象,比如:
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"方法的使用,如果有需要可以采用这种方式来解决问题.
posted on 2008-03-19 22:24 zhangchao 阅读(1641) 评论(8)  编辑  收藏 所属分类: Ext

FeedBack:
# re: Ext中的namespace[未登录]
2008-04-04 10:16 | hehe
0和o不分,很难让人看懂那个namespace的意思,呵呵。  回复  更多评论
  
# re: Ext中的namespace[未登录]
2008-04-04 11:04 | hehe
之所以能够这样做,主要是因为在执行eval('if (typeof ' + rt + ' == "undefined"){' + rt + ' = {};} o = ' + rt + ';');
时,没有在rt前面加var 关键字,或者说没有加var关键字的变量定义,其作用域是全局的。
o[d[j]]=o[d[j]] || {};
o=o[d[j]];
这两句完成对象的创建和链接引用。
  回复  更多评论
  
# re: Ext中的namespace
2008-04-08 12:09 | zhangchao
@hehe
编辑的时候我用的是'0',但不知怎么搞的发布后就变成'o'了。既然你已经看出应该是'0',那么你也应该知道namespace怎么用了,呵呵.  回复  更多评论
  
# re: Ext中的namespace
2008-04-08 12:11 | zhangchao
@hehe
这跟全局变量和局部变量没有关系,况且'var a=arguments, o=null, i, j, d, rt;'
已经用var声明了变量o.  回复  更多评论
  
# re: Ext中的namespace
2009-06-29 17:59 | gongmingwind
请教下
o和rt不都是局部变量吗,为什么会创建两个全局变量呢?  回复  更多评论
  
# re: Ext中的namespace
2009-06-29 22:31 | gongmingwind
@gongmingwind
这个我弄明白了!呵呵,在js中,没有定义的变量默认为全局变量。  回复  更多评论
  
# re: Ext中的namespace
2009-06-29 22:32 | gongmingwind
谢谢,你的文章  回复  更多评论
  
# re: Ext中的namespace
2009-07-17 17:59 | 得到
很好  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: