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。
// 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
if (overrides){
var p = origclass.prototype;
for ( var method in overrides){
p[method] = overrides[method];
}
}
},
override在意义上与apply有点相像,但都是用来复制一个对象的属性和方法,但差别就在于apply是直接复制过去,是复制到一个object上,而override是复制到一个类上,准确说是一个function的prototype上,因此要求origclass应该是一个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是否还有其他用意,如果那位朋友知道,希望指点一下。