`
KeepCrazy
  • 浏览: 60210 次
社区版块
存档分类
最新评论

ExtJs源码学习之namespace和urlEncode

阅读更多
[size=medium]
    真的很惭愧,花了一个半小时才读完两个函数, 亏得我还是挑了较简单的来看。有两个原因。第一个肯定是自己的基础不扎实。说实话,我的js功底的确不怎么好, 只知道用一些常用的函数来实现一些普通的功能。对于那些自己不怎么用的函数看都不想看一下。读了几个函数的代码后才发现,不这那些函数不常用,而是已经被人家封装成更常用的了。都是着了浮躁的道, 痛定思过, 一定要改。 第二个原因,编写ext的那些大牛们实在是太牛了, 太惜行如金了,大量使用了 ||、&&和三目运算符,人家需要十几行的代码大牛们一行搞定。结果代码是紧凑了,但可读性就低了。比如这句:buf.push('&', e(key), '=', (!Ext.isEmpty(val) && (val != key || !empty)) ? (Ext.isDate(val) ? Ext.encode(val).replace(/"/g, '') : e(val)) : '');

不多发表感慨了,总结一下今天的阅读收获。

先是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;
        }

    第一个难点在  o = window[d[0]] = window[d[0]] || {};   这句上面.    首先执行  window[d[0]] || {};     若window[d[0]]为空或undefined, 返回{},否则返回window[d[0]]; 然后执行window[d[0]]=  .    这个window[val]看起来有点难理解. 其实它的意思是给window对象名为val的属性赋值, 再说白了就是创建一个名为val的变量. 例如window['abc']='abc'的效果和 var abc='abc'; 相同. (若想知道为什么, 可以去W3CSchool看看windows对象的说明).  最后执行o=window[d[0]].
    我遇到的第二个坑是在slice函数上。刚看见它时怎么看怎么陌生,查了W3CSchool才知道它是数组对象的一个函数:arrOjb.slice(start,end),效果类似于字符串的substring().汗颜!再感慨一下: 基础不牢啊!

    这个函数的返回值不是创建的所有对象,而后创建最后一个对象。如Ext.namespace("a","b","c.d.e");返回的是对象e。

然后是Ext.urlEncode。挑它不是因为它常用, 而是因为它看起来好欺负。
urlEncode : function(o, pre){
            var empty,
                buf = [],
                e = encodeURIComponent;

            Ext.iterate(o, function(key, item){
                //alert("key="+key+",item="+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; 这个是小坎, 查查文档就明白了:‘encodeURI() 函数可把字符串作为 URI 进行编码。如果 URI 组件中含有分隔符,比如 ? 和 #,则应当使用 encodeURIComponent() 方法分别对各组件进行编码。’  将encodeURIComponent赋给e纯粹是为了使用方便。
    第二道坎是
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)) 

: '');
                });
            });


    没错, 这一大段代码一开始都没读懂。文档中的函数说明是‘Takes an object and converts it to an encoded URL. e.g. Ext.urlEncode({foo: 1, bar: 2}); would return "foo=1&bar=2".  Optionally, property values can be arrays, instead of keys and the resulting string that's returned will contain a name/value pair for each array value.’, 意思是说这个函数可以处理json对象,也可以处理数组。当参数为json对象时,这个函数的执行过程很容易理解,但当参数为数组时就不那么直接了. 直到我加入上面那句alert后才有点明白:Ext.iterate在处理数组对象如["a","b"]时,会把它当作json对象{a:0,b:1}来看. 
    至于buf.push('&', e(key), '=', (!Ext.isEmpty(val) && (val != key || !empty)) ? (Ext.isDate(val) ? Ext.encode(val).replace(/"/g, '') : e(val)) : '');这一句有点太长了.可以拆分为buf.push('&', e(key), '=')和buf.push((!Ext.isEmpty(val) && (val != key || !empty)) ? (Ext.isDate(val) ? Ext.encode(val).replace(/"/g, '') : e(val)); 那么最难理解的就是!Ext.isEmpty(val) && (val != key || !empty)这个判断了. 到现在都没想明白val != key || !empty这个条件会在什么情况下起作用,即,val在什么情况下会等于key? 难道会出现传入{...,undefined:undefinde,...}或{...,null=null,...}这种两种参数的情况? 如果没有传入这两怪异的参数的话, (!Ext.isEmpty(val) && (val != key || !empty))就可以简化为!Ext.isEmpty(val)了,剩下的也好理解了.
    第三个坎是buf.shif()这个函数:arrayObject.shift()方法用于把数组的第一个元素从其中删除,并返回第一个元素的值。
ps:遇到的坎越多,只要不被吓倒, 收获就越大. 
昨天本来还看了Ext.extend的源代码, 不过硬是被打击了.
[/size]
2
0
分享到:
评论

相关推荐

    ExtJs源码

    extjs 源码,有兴趣的可以学习下

    extjs4 学习笔记源码

    exjts4 学习笔记源码,源码包含windws,hbox,vbox和Grid的应用,其中grid介绍比较多。下载解压后,部署后就可以使用,所有代码均在demo文件夹下。更多extjs4教程,请关注http://www.mhzg.net

    extjs 源码

    这个源码包不仅包含了EXTJS 3.0的核心库,还提供了相关的文档和代码示例,这对于开发者深入理解EXTJS的工作原理、学习如何自定义组件以及优化应用性能是非常有价值的。 首先,EXTJS 3.0的核心库包含了大量的UI组件...

    ExtJs源码上传和下载

    下载完成后,你需要解压文件到本地计算机,以便进一步开发和学习。 在解压后的`ext-3.3.1`文件夹中,你会找到以下几个关键部分: 1. **src** 目录:包含了ExtJs的核心源码,这些JavaScript文件按照模块化组织,...

    Extjs源码之--Ext事件机制/继承关系

    在EXTJS这个强大的JavaScript框架中,事件机制是其核心组件之一,它允许组件之间进行通信和交互。在“Extjs源码之--Ext事件机制/继承关系”中,我们将深入探讨EXTJS如何处理事件以及其类层次结构。EXTJS的事件处理...

    extJS myeclipse源码示例

    extJS myeclipse源码示例

    ExtJS3.0 源码分析与开发实例宝典

    ExtJS3.0 源码分析与开发实例宝典

    extjs 的 源码包

    一个extjs的源码包.其中包括extjs的例子和文档.

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

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

    extjs源码及API

    extjs下载 extjs源码 extjsApi,全部包括在这里面

    Django整合Extjs源码

    1. **阅读源码**:逐个文件分析,了解每个部分的作用,尤其是Django的settings.py、urls.py和views.py,以及ExtJS的主入口文件(如app.js)。 2. **运行项目**:根据项目文档或README文件设置好环境,运行项目并观察...

    ExtJS源码分析与开发实例宝典4.pdf

    这个是《ExtJS源码分析与开发实例宝典》高清版本,是本人花钱买来的,所以分享给大家,希望大家喜欢,由于本人一次只能上传60M大的文件(试了好多次,每次都上传到99%就不动了,还以为csdn在后台审核内容呢,害我电脑...

    ExtJS源码分析与开发实例宝典完整版

    ExtJS源码分析与开发实例宝典完整版 1、JS画图部分代码在IE8上看不到效果,因为IE8不支持VML。 2、扩展的组件为作者独立完成,仅供学习之用,一些组件并没有经过严格的测试。 如果需要用到项目之中,请自行测试。 ...

    EXTJS 源码3.4

    extjs源码3.4 里面有其他JS,直接调用就行

    ExtJS源码分析与开发实例宝典2.pdf

    这个是《ExtJS源码分析与开发实例宝典》高清版本,是本人花钱买来的,所以分享给大家,希望大家喜欢,由于本人一次只能上传60M大的文件(试了好多次,每次都上传到99%就不动了,还以为csdn在后台审核内容呢,害我电脑...

    ExtJS源码分析与开发实例宝典0.pdf

    这个是《ExtJS源码分析与开发实例宝典》高清版本,是本人花钱买来的,所以分享给大家,希望大家喜欢,由于本人一次只能上传60M大的文件(试了好多次,每次都上传到99%就不动了,还以为csdn在后台审核内容呢,害我电脑...

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

    资源名称:Ext JS源码分析与开发实例宝典内容简介:本书全面系统地剖析了ExtJS 3.0的架构设计原理。通过对源码的“抽丝剥茧”,读者可以掌握Ext JS架构的精妙,从原理层面用活Ext JS。此外,本书还提出了大量的解决...

    ExtJS源码分析与开发实例宝典1.pdf

    这个是《ExtJS源码分析与开发实例宝典》高清版本,是本人花钱买来的,所以分享给大家,希望大家喜欢,由于本人一次只能上传60M大的文件(试了好多次,每次都上传到99%就不动了,还以为csdn在后台审核内容呢,害我电脑...

    EXTJS源码人力资源

    EXTJS源码是开放的,允许开发者查看、学习和修改其内部工作原理。这对于理解EXTJS的工作方式,优化性能,或者根据特定需求自定义功能非常有帮助。要将EXTJS源码应用于本地开发,你需要一个本地开发环境,包括Web...

    深入浅出extjs 源码

    作者徐会生、何启伟和康爱媛以其丰富的编程经验和深入的理解,将复杂的ExtJS源码剖析得清晰易懂,旨在帮助读者深入理解这个强大的JavaScript库,提升开发效率和代码质量。 ExtJS是一个基于JavaScript的用户界面库,...

Global site tag (gtag.js) - Google Analytics