直达篇看到Ext.extend,接着向下看。

Ext.namespace,用来管理Ext库命名空间的法

namespace : function(){
    var o, d;
    Ext.each(arguments, function(v) {
        d = v.split(".");
        o = window[d[0]] = window[d[0]] || {};
        Ext.each(d.slice(1), function(v2){
            o = o[v2] = o[v2] || {};
        });
    });
    return o;
},

 

绝大多数动静下会这样使用

Ext.ns("Ext.util", "Ext.lib", "Ext.data");

Ext.ns是Ext.namespace的简写,这时会吗全局的Ext变量挂及util,lib,data属性,Ext.util,Ext.lib,Ext.data默认都是拖欠的对象。当然也堪非Ext开头的命名空间。

 

Ext.namespace内部采用了Ext.each,顺藤摸瓜

each : function(array, fn, scope){
    if(Ext.isEmpty(array, true)){
        return;
    }
    if(!Ext.isIterable(array) || Ext.isPrimitive(array)){
        array = [array];
    }
    for(var i = 0, len = array.length; i < len; i++){
        if(fn.call(scope || array[i], array[i], i, array) === false){
            return i;
        };
    }
},

率先判断第一独参数array是否为数组,如果也空直接回到。接着判断array是否只是迭代,对于频繁组、NodeList、
HTMLCollection都是不过迭代的,即返true。不可迭代的,如基本类型的字符串,数字相当于会见以那个卷入成组。接着就是for循环,回调函数
fn,fn的实行上下文scope,scope如果没有传默认为array[i],即于fn内利用this取到集结的各国一个素。fn的第一个参数为集聚
元素,第二单参数i为索引,第三只参数为于迭代元素自身。

 

末段还有个技术,可以在fn内利用有条件也false如 return i=3
来歇迭代,这时候会回迭代最后一浅的索引i。

可以看出 Ext.each 的用法及 JQuery.each
类似,不同之处在于Ext.each的老三个参数可以指定回调函数的尽上下文,jQuery.each
的老三只参数就供库内部用。

 

Ext.each中应用了Ext.isEmpty方法,

isEmpty : function(v, allowBlank){
    return v === null || v === undefined || ((Ext.isArray(v) && !v.length)) || (!allowBlank ? v === '' : false);
},

Ext.isEmpty中有句(Ext.isArray(v) &&
!v.length),这里以逻辑非运算符而没有使==,如(Ext.isArray(v) &&
v.length==0)。即当v是数组时还要检测数组是否也空,如length为4,则!v.length就为false了。即数组不也空。

 

于看Ext.toArray方法,也是一个匿名函数打实施,执行后回去的function才是当真的Ext.toArray

toArray : function(){
 return isIE ?
     function(a, i, j, res){
         res = [];
         for(var x = 0, len = a.length; x < len; x++) {
             res.push(a[x]);
         }
         return res.slice(i || 0, j || res.length);
     } :
     function(a, i, j){
         return Array.prototype.slice.call(a, i || 0, j || a.length);
     }
}(),

可以看出实现时对浏览器进行了判断,IE使用for循环的遍历
伪数组
,将那个push到res中。非IE浏览器虽然采取Array.prototype.slice。

IE中为何无可知采取Array.prototype.slice呢,对于NodeList等并非一个JavaScript
object。会抛异常。怿飞
总结过。

只是,随着IE9的公布,其早已拿javascript引擎内置在浏览器被,见图

jQuery 1

IE9 中Array.prototype.slice.call(NodeList)
已经不复抛大了,可以以该以NodeList等易为数组。因此Ext.isIE这个标准转呢
Ext.isIE6||Ext.isIE7||Ext.isIE8
则较为合理了。之前DOM的失实实现为部分修复了,相关
Blog

 

Ext.iterate方法,

iterate : function(obj, fn, scope){
    if(Ext.isEmpty(obj)){
        return;
    }
    if(Ext.isIterable(obj)){
        Ext.each(obj, fn, scope);
        return;
    }else if(Ext.isObject(obj)){
        for(var prop in obj){
            if(obj.hasOwnProperty(prop)){
                if(fn.call(scope || obj, prop, obj[prop], obj) === false){
                    return;
                };
            }
        }
    }
},

马上是一个通用迭代器,可以迭代数组,也堪是目标。当也迭代数组/伪数组
时其实是调动用点提到的 Ext.each。参数与用办法呢跟 Ext.each 类似。

 

Ext.urlEncode,该措施用来用js对象序列化成查询字符串

urlEncode : function(o, pre){
    var empty,
        buf = [],
        e = encodeURIComponent;

    Ext.iterate(o, function(key, item){
        empty = Ext.isEmpty(item);
        Ext.each(empty ? key : item, function(val){
            buf.push('&', e(key), '=', (!Ext.isEmpty(val) && (val != key || !empty)) ? (Ext.isDate(val) ? Ext.encode(val).replace(/"/g, '') : e(val)) : '');
        });
    });
    if(!pre){
        buf.shift();
        pre = '';
    }
    return pre + buf.join('');
},

内部用了简写的 e =
encodeURIComponent, encodeURIComponent
可以这么形容,其是核心js对象,document.getElementById
等BOM对象则免能够这样简写。

 

Ext.urlDecode 则是用查询字符串转换成js对象。

Ext.urlAppend 添加字符串到查询url。

 

Ext-2012-4-21.rar

相关文章

网站地图xml地图