从ext-base.js写起
window.undefined = window.undefined;
写法很奇怪?但js库基本都有这么一行。为什么要把自己赋给自己呢?
注释写的比较明白,是为了兼容旧游览器,查询资料后发现,主要是IE5并没有定义Undefined这个基本类型,没有undefined这个特殊的全局属性,为了保持各个游览器的一致性,在IE5里没有,我们就为它添加这样一个全局属性,这行在IE5中等价于window.undefined="undefined";
Ext = {
/**
* The version of the framework
* @type String
*/
version : '3.0'
};
很简单,创建一个名为Ext的单例对象,现在这个EXT对象,里面只有一个属性version,就是版本号,我这里用的是EXT的3.0版本,我自己比较浅显的理解是,它主要是给用户暴露出一个全局的对象,以便用户进而可以访问这个Ext对象的属性和使用这个对象的方法。
就如同其名(ext-base),它是搭建EXT绚烂世界的基础。
Ext.apply = function(o, c, defaults){
// no "this" reference for friendly out of scope calls
if(defaults){
Ext.apply(o, defaults);
}
if(o && c && typeof c == 'object'){
for(var p in c){
o[p] = c[p];
}
}
return o;
};
首先,从EXTJS框架整体上看(其实是个人猜测,请指正),EXT先写这个函数的作用是为了方便给给不同的对象添加属性和函数。
注:for-in主要用来迭代出对象的全部属性
分析下,这个方法的实现。
为Ext对象添加的第一个方法,首先理解其用处是,如果第二个参数不存在的情况下,把第二个对象里的属性赋给第一个对象,很显然如果有同名属性的话,第一个属性里的这个同名属性会被覆盖掉,如果第三个参数存在的话,就会调用Ext.apply本身这个函数,注意下调用的时候defaults被当成第二个参数,第三参数没有。,然后,第一个对象也就添加了defaults的所有属性,这个调用本身的Ext.apply执行结束。然后再顺序执行
if(o && c && typeof c == 'object'){
for(var p in c){
o[p] = c[p];
}
}
也就是第一个参数对象拷贝第二个参数对象的属性。
总结,就是第一个对象复制第二个对象的所有属性,如果有第三个参数,会把第三个参数对象的属性也复制进第一个参数对象中(也就是提供一个默认值),个人觉得,翻译版的官方文档中对这个函数解释的并不准确。
下面Ext所有的代码就都放在的就是一个立即执行的闭包中,这和jquery有异曲同工之妙,为了防止添加过多的全局变量。
(function(){
...Extjs代码
})();
后面的代码,对于我来说还是比较有难度的,每天一点点,一定要坚持,加油。