`

ExtJs源码分析与学习—ExtJs核心代码(二)

阅读更多

接上篇

下面介绍Ext.js中其他核心方法

 

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

 

namespace : function(){
            var o, d;
            Ext.each(arguments, function(v) {//循环遍历所传的参数
                d = v.split(".");//返回字符串数组
                o = window[d[0]] = window[d[0]] || {};//把数组第一个元素作为window对象的一个子对象
                Ext.each(d.slice(1), function(v2){//再把数组中其他元素按顺序作为o的子对象,注意是逐级的,即第二个元素是o的子对象,第三个元素是o的子对象的子对象,依次类推
                    o = o[v2] = o[v2] || {};
                });
            });
            return o;
        },

 

该方法实现了js命名空间的管理,类似于java包结构,其Ext.ns是该方法的简写,Ext.namespace中用到了方法Ext.each

 

each : function(array, fn, scope){
            if(Ext.isEmpty(array, true)){
                return;
            }
            //判断array是否可迭代,对于数组、NodeList、HTMLCollection都是可迭代的,即返回true。
            //或者是字符型,数字型和布尔型时直接封装成数组
            if(!Ext.isIterable(array) || Ext.isPrimitive(array)){
                array = [array];
            }
            for(var i = 0, len = array.length; i < len; i++){
            	//fn的第一个参数为集合元素,第二个参数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);
        },

 

如果传入的值是null、undefined或空字符串或空数组,则返回true。
allowBlank(可选的)如果该值为true,则空字符串不会当作空而返回true。

 

Ext.isEmpty中调用了Ext.isArray,用来判断是否为数组

 

isArray : function(v){
            return toString.apply(v) === '[object Array]';
        },

 

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);
                 };
         }(),

该方法有三个参数,如果只传入a,则取可迭代的所有元素

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

IE中为何不能使用Array.prototype.slice呢,对于NodeList等并非一个JavaScript object。会抛异常。怿飞   总结过。

然而,随着IE9 beta的发布,IE9中已经将javascript引擎内置在浏览器中,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(typeof obj == 'object'){
                for(var prop in obj){
                    if(obj.hasOwnProperty(prop)){
                        if(fn.call(scope || obj, prop, obj[prop], obj) === false){
                            return;
                        };
                    }
                }
            }
        },

 

 urlDecode

 把一个已经encoded的URL字符串转换为对象。如Ext.urlDecode("foo=1&bar=2"); 就是{foo: "1", bar: "2"}; Ext.urlDecode("foo=1&bar=2&bar=3&bar=4", false);就是{foo: "1", bar: ["2", "3", "4"]}。
overwrite (可选的)重复名称的就当作为数组,如果该项为true就禁止该功能(默认为false)。

 

urlAppend

//追加url参数

 

getDom

返回dom对象,参数可以是string(id),dom node,或Ext.Element。

 

getBody

 

返回当前document.body的Ext.Element 类型。

 

getHead

 

返回当前document.head的Ext.Element 类型。

 

removeNode

移除document的DOM节点。如果是body节点的话会被忽略。

 

isDate

返回true表名送入的对象是JavaScript的date类型对象,否则为false。

 

还有常用的isObject、isPrimitive(是否为字符数字或布尔型)、isFunction、isNumber、isString、isBoolean、isElement、isDefined(是否为undefined)

 

其他的方法就是一些判断浏览器类型和版本以及操作系统等,这里就不罗列了,详细查看源代码

 

分享到:
评论

相关推荐

    ExtJs源码分析与学习—ExtJs核心代码(一)

    NULL 博文链接:https://linder0209.iteye.com/blog/865372

    ExtJs源码分析与学习—ExtJs核心代码(三)

    NULL 博文链接:https://linder0209.iteye.com/blog/882451

    Extjs源码分析与开发实例宝典

    《Extjs源码分析与开发实例宝典》全面介绍了ExtJS的技术细节和开发实践,是学习和掌握ExtJS不可或缺的资源。通过对本书的深入阅读,开发者不仅可以理解ExtJS的工作原理,还能学会如何运用ExtJS构建高效、美观的Web...

    资料:包括extjs2.0源码

    6. **图表组件**:EXTJS 2.0内置了各种图表类型,如柱状图、饼图、线图等,适用于数据可视化需求,源码分析有助于定制高级图表功能。 7. **Ajax交互**:EXTJS 2.0通过Ajax技术实现与服务器的异步通信,提供了强大的...

    Django整合Extjs源码

    **Django整合ExtJS源码解析** 在Web开发领域,Django作为一个强大的Python Web框架,以其高效、安全和可扩展性而备受青睐。与此同时,ExtJS是一个JavaScript库,用于构建富客户端应用程序,提供了丰富的组件和数据...

    ExtJS 3.4 源码包

    1. **ExtJS核心概念** - **组件模型**:ExtJS基于组件化设计,每个UI元素都是一个可复用的组件,如窗口(Window)、表格(Grid)、表单(Form)等。 - **布局管理**:ExtJS提供多种布局方式,如Fit布局、Border...

    ExtJs 实例+ExtJs中文教程(学习extjs必备)

    最后,结合源码分析,提升你的编程水平,能够更好地应对复杂的应用需求。 总之,ExtJs是一个强大的JavaScript框架,通过学习提供的实例和中文教程,结合具体的代码实践,你将能够开发出功能丰富、用户体验优秀的Web...

    ExtJS源码分析与开发实例宝典--书中代码

    核心技术部分深入讲解Ext JS的核心基础知识,包括JS原生对象的扩展、事件机制、 模板模型、数据模型,包括一个机制、两个模型及六个扩展。基于元素的开发部分讲解了在DOM元素基 础上扩展的Ext JS元素,包括元素操作...

    Extjs 4.0 源码说明文档入门手册 和示例

    源码分析: 在`ext-4.0.0`目录中,你将找到ExtJS 4.0的核心源代码。这些文件主要分为以下几个部分: 1. `src`目录:这是ExtJS的核心源码存放处,包含了所有组件、类和工具函数。每个主要的组件或功能都有自己的子...

    extjs grid.panel 项目 源码

    10. **最佳实践**:源码分析也能让我们学习到ExtJS开发的最佳实践,例如如何有效地组织代码,如何优化数据加载,以及如何保持组件的可维护性。 通过深入研究这个"extjs grid.panel 项目 源码",我们可以提升对ExtJS...

    掏钱学ExtJs完全版附全部源码- 康海涛

    康海涛的"掏钱学ExtJs完全版"可能是一份全面的学习资料,涵盖了ExtJs的基础到高级应用,包括源码分析,旨在帮助学习者深入理解和掌握这一技术。 首先,ExtJs的核心是其组件模型。它提供了大量的预定义组件,如表格...

    EXTJS部分中文源码

    通过分析源码,开发者可以学习到如何自定义组件,优化性能,甚至开发自己的EXTJS插件。此外,熟悉EXTJS的源码也有助于解决在实际项目中遇到的问题,因为有时官方文档可能不包含所有细节,而源码往往能给出最准确的...

    extJS3.1源码及demo

    在"extJS3.1源码及demo"这个资源中,你将找到ExtJS 3.1.0的完整源代码和相关的示例。源码的分析对于深入理解框架的工作原理至关重要,特别是对于那些想要进行定制化开发或者优化性能的开发者来说。源码包含了各种...

    基于ExtJS5的后台管理系统案例 - 源码

    ExtJS5是一款强大的JavaScript框架,主要用于构建富客户端的Web应用程序,尤其在开发复杂的后台管理系统时,它的优势尤为显著。...案例中的源码分析和实践将加深对框架的理解,为后续的Web开发工作打下坚实基础。

    ExtJs源码以及文档相关资料

    这个资料包“ExtJs源码以及文档相关资料”显然包含了ExtJS 4.1.1版本的源代码和相关的文档,这对于深入理解ExtJS的工作原理和学习如何使用它是极为宝贵的资源。 首先,ExtJS 4.1.1是该框架的一个稳定版本,发布于...

    ExtJS4.0-WEB开发项目源代码

    在“ExtJS4.0-WEB开发项目源代码”这个资源中,你将有机会接触到基于ExtJS 4.0版本的项目实例,这对于学习和理解ExtJS的应用开发是非常有价值的。 首先,让我们深入了解ExtJS 4.0的关键特性: 1. **组件化**:...

    Ajax框架ExtJS3.0源代码

    源码分析有助于提升对JavaScript和Web开发的理解,对于前端开发者来说,是一份宝贵的参考资料。 1. **组件系统**:ExtJS3.0的组件模型是其核心部分,包括窗口(Window)、表格(Grid)、面板(Panel)、按钮...

    进销存php源码(extjs)

    解压后,开发者可以查看源代码,理解其架构和实现方式,以便于二次开发或自定义需求。通常,源码会包含前端EXTJS的JS和CSS文件,后端PHP的控制器、模型、视图文件,以及数据库配置和SQL脚本。 总的来说,进销存php...

    深入浅出ExtJS随书源码--EXTJS2.0

    "深入浅出ExtJS随书源码--EXTJS2.0"是针对ExtJS 2.0版本的学习资源,通常与一本相关书籍配套,帮助读者通过实际代码加深对ExtJS的理解。 源码分析: 1. **组件系统**:ExtJS的核心是其组件模型,其中包括各种可...

    ExtJs3.1目前所有例子源代码

    这个压缩包包含了ExtJs 3.1的所有示例源代码,对于初学者来说,是一个宝贵的资源,可以用来学习和理解这个框架的工作原理。 首先,让我们深入了解一下ExtJs 3.1中的核心概念和主要特性: 1. **组件化**:ExtJs的...

Global site tag (gtag.js) - Google Analytics