EXT源码解析:EXT.js(二)

id :  function (el, prefix){
            prefix 
=  prefix  ||   " ext-gen " ;
            el 
=  Ext.getDom(el);
            
var  id  =  prefix  +  ( ++ idSeed);
            
return  el  ?  (el.id  ?  el.id : (el.id  =  id)) : id;
        },

该方法的作用是用来生成一个唯一的id,其两个参数都是可选参数。
el是要设定id的dom元素,prefix是id串的前缀,如设定为“aaa_”则生成的id格式为“aaa_234”,prefix=prefix||"ext-gen",使用逻辑运算符在js中特殊性来设定了默认前缀为ext-gen。

//----------------------小插一段有关js逻辑运算符的特殊应用-------------------------
利用||及&&的特殊性在书写js代码时一定程度上可以简化代码长度。
a||b:如果a为true或等价于true的值,则不计算b的值,如果a为false或等价于false的值,则计算b的值。a,b可以为表达式等,等价于if(!a){b}。
var a=2,b=1,c=0;
a||(b=2);  //该运算后b的值仍然是1
c||(b=2);  //此时b的值被改变为2。
a&&b:如果a为true或等价于true的值,则计算b的值,否则不计算b的值,等价于if(a){b}。
//-----------------------------------完毕------------------------------------

var id = prefix + (++idSeed);  因为idSeed在闭包范围内相当于一个全局变量,因此通过递增运算符保证其不会重复。

最后的一行主要做了对不同情况的处理:
(1)如果el存在,则判断el是否有id,如果有则直接返回el的id,如果没有则将生成的id做为el的id属性赋给el,并返回该id。
(2)如果el不存在,则直接返回生成的id。

 

extend :  function (){
            
//  inline overrides
             var  io  =   function (o){
                
for ( var  m  in  o){
                    
this [m]  =  o[m];
                }
            };
            
return   function (sb, sp, overrides){
                
if ( typeof  sp  ==   ' object ' ){
                    overrides 
=  sp;
                    sp 
=  sb;
                    sb 
=   function (){sp.apply( this , arguments);};
                }
                
var  F  =   function (){}, sbp, spp  =  sp.prototype;
                F.prototype 
=  spp;
                sbp 
=  sb.prototype  =   new  F();
                sbp.constructor
= sb;
                sb.superclass
= spp;
                
if (spp.constructor  ==  Object.prototype.constructor){
                    spp.constructor
= sp;
                }
                sb.override 
=   function (o){
                    Ext.override(sb, o);
                };
                sbp.override 
=  io;
                Ext.override(sb, overrides);
                
return  sb;
            };
        }(),

extend在EXT中有着相当大的分量,在其每个js文件中都可以见到extend的使用,因此理解这个函数对于理解Ext各部分的代码有着很重要的意义。该方法实现了Ext的继承机制。虽然短短20多行,但理解起来还煞是困难。本人当初看了不下5遍都没能完全理解(我IQ太低也许),后来得到一些高人指点才逐渐理解,理解这个函数关键是理解constructor和prototype几个关键字的意义。要解释清楚这个函数,估计要专开一篇文章,给大家推荐一篇好文章,我就不做赘述了,免得浪费互联网空间,。Ext.extend用法以及代码解读http://www.blogjava.net/dragonshrimp/archive/2008/03/25/183060.html

 

override :  function (origclass, overrides){
            
if (overrides){
                
var  p  =  origclass.prototype;
                
for ( var  method  in  overrides){
                    p[method] 
=  overrides[method];
                }
            }
        },

override在意义上与apply有点相像,但都是用来复制一个对象的属性和方法,但差别就在于apply是直接复制过去,是复制到一个object上,而override是复制到一个类上,准确说是一个function的prototype上,因此要求origclass应该是一个function。

 

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]];
                }
            }
        },

namespace又是EXT中的一个好东西,该方法实现了命名空间的功能。
看起源码可知,Ext是将每个属性节点设置成了空的对象直接量{},当然要先判断该节点是否已经存在。
该函数允许一次创建多个命名空间。
但有一个问题需要说一下:我看Ext示例及帮助有这样的写法。Ext.namespace('Company', 'Company.data');即是一级一级的创建的,其实看其代码实现不难看出,直接写入最深的命名空间则会自动创建前面各级的命名控件,因此只需要写Ext.namespace( 'Company.data');即可。不知道EXT是否还有其他用意,如果那位朋友知道,希望指点一下。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值