[No.1] jQuery源码解析—搭建框架(1)

在学习jQuery源码之前,

大家需要对javascript基础知识掌握,

基本的使用方式应该比较了解。

有了以上的基础知识以后,

我们打开jQuery的网站(jquery.com)。

点击这个Download我们可以获取到最新的源码,

点进去之后了,

我们可以看到1.1.0和2.0.3的版本。

先来说说他们有什么区别,

从2点几的版本就不支持IE6,7,8了,

只支持一些高级浏览器,

所以这次源码分析选择的是2.0.3的,

为什么要选择2.0.3呢,

就是因为它不支持IE6,7,8的话,

这样的话在源码当中会减少之前的一些兼容性写法,

对于我们了解jQuery实现的原理还是有帮助的,

所以说选择2.0.3的版本,让大家来分析。

下载地址:https://github.com/fewusheng/jquery

文件我已经下载好了,那我把他打开。

我们从第一行开始到最后一行,一共有8830行,

这个代码量是相当庞大的,

就算我们把这些注释去掉,代码量也是非常之多的。

如果一上来就给大家一行一行的讲的话,

我相信不少同学会有点懵,刚开始听就晕掉了,

所以,我们可以先对这个jquery框架进行简化处理,

把这个架子先给大家简单的搭出来,

然后,我们再逐个逐个地进行分析。

首先,新建个js文件,

比如,我这里命名的为简化JQ源码。

然后我们打开jquery,

上来有一堆注释是吧。

这会儿,我们先不着急,

等后续的时候我在给大家详细的说。

那我们先从第一行代码看起:

(function( window, undefined ) {...

这里是把一个匿名函数放到一个小括号之中,

然后到jquery源码最后的一行有一个闭合的写法。

 ... })( window );

这样的写法,我们来看一下。

打开我们创建的 js 文件。

首先创建一个函数,

把它放在一个小括号当中,

然后后边在加个小括号。

function( ){


    }) ( );

这种写法我们把它叫做“匿名函数自执行”

它跟普通的不加这些东西是一样的,

里面的代码也会执行,

那它有什么好处呢?

那我开个页面跟大家说一下。

比如我们在这里创建了一个变量a等于10,

在外边是找不到的,我们来试一下。

<script>

function( ){

        var a = 10;

    } ) ( ) ;

    console.log);

</script>

打印出来的结果是:

报了一个错,这里的a是调用不到的,

所以大家知道了jquery为什么把所以的代码,

都放在这个匿名函数当中,

其作用就是想让这些代码变成局部的,

这样就可以防止跟其它代码发生冲突,互相不影响。

jquery光把这些内容变成局部的,也是不够的,

它需要对外提供接口,我们才可以在外边找到。

所以说怎样从匿名函数对外提供接口,

做法很简单,也有很多方法。

比如说有一种方法就是你要对外提供的接口,

挂在到window的下边。

<script>

     (function(){

          var a = 10;

          function $(){

                console.log(a);

         };

        window.$ = $;

        })( );

        $();

</script>

所以在这个地方再去调用的是window下的$,

也就是相当于调用的$,

我们打开网页刷新一下。

打印结果是:

这时的结果就找到了,

所以说呢jquery其实它也是这样做的,

我们打开jquery看到里面定义了很多变量,

除了变量还有很多函数,所以我们来写一下,

从21行到94行,定义了一些变量和函数。

(function(){

        (21 , 94)

        定义了一些变量和函数

 })( );

其中,有一个函数是特别重要的,

就是下边我们看到jQuery。

把它写在我们的js文件里。

(function(){

        (21 , 94)

        定义了一些变量和函数

        jQuery = function(){}

})( );

其实这个jQuery就是我们平时用的

$()去找东西,jQuery()去找元素这个对外的接口,

这里它是一个局部的函数,我们要怎样找到它呢?

就要向上面说过的要提供对外的接口,

所以在jQuery里面对应的接口在8826行。

这里就是把 jQuery 函数挂在到了 window 下边,

或者 window 下的 $ ,

所以说我们就可以通过外边来找到 jQuery,

或者说通过$ 找到 jQuery 这个函数,

这就是对外提供的接口。

接下来我们继续网下看,到了96行,

这里我们看到了jQuery的prototype,

看到prototype我们就知道这是原型,

所以说原型是面对对象的东西,

从而得知了jQuery就是基于面向对象的程序,

所以说从96行开始到283行结束,

这些就是给jQuery对象,添加一些方法和属性。

接下来,

我给大家说一下为什么jQuery是基于面向对象的程序。

<script>

        $('#div1').css();

        $('#div1').html();

        // 像不像我们平时使用的面向对象啊,

        // 比如说我建一个数组对象

        var arr = new Array();

        // 这样了,我就可以在这些数组中写一些方法

        arr.push();

        arr.sort();

</script>

大家来看看,

之所以push和sort可以调用的话,

说明前面是对象在调用这个方法。

这种写法特别类似于我们的jQuery的写法,

那么大家就知道了,

如果$('#div1')是个对象的话,

就是不是可以这样去写了啊。

所以说这个和面向对象是一样的,

只不过$('#div1')不是一个对象,

它只是一个函数调用,

如果说它的执行结果是对象,

是不是也可以?

我们接着刚才看的那个jQuery函数,

可以发现函数执行完了后,

结果 rerun 当中就是一个new构造函数的过程,

所以说返回的就是一个jQ对象啊,

既然可以返回的是对象,

那么这个对象就可以调用这个方法了。

我们继续,从285 - 347行,

jQuery.extend = jQuery.fn.extend = function() {

                ......

    };

extend是jq中继承的一个方法,

它的作用就是希望后续添加的代码,

都可以通过extend方法,

把它挂在到jQuery对象当中。

利用继承有利于后续的扩展,

和插件的扩展。

接着,从349 -817行,

jQuery.extend({

            ...

    });

这一块就是扩展工具的方法,

在jQuery给了我们两种操作代码的方式,

<script>

    // 一种是

    $().css();

    $().html();

    // 还有一种是

    $.trim();

    $.proxy();

</script>

它们还是有区别的,

上面那种它是面向对象实例的方法,

下面这里是函数下边扩展的方法,

这就是扩展一些静态的方法。

所以在jQuery当中,

来给面向对象扩展静态属性和静态方法的时候,

我们就把它叫做扩展工具方法。

下边这种方法既可以给jq用也可以给原生的js来用,

而上面的方法只能给jQuery对象用。

所以说扩展工具方法用利于

后期我们写东西的时候用,

其实我们可以把静态方法,

看成是在jQuery中最底层的一个东西,

而上面的是上一层或更高级的东西,

它们俩是这样一种关系,

所以说很多方法都是实例方法,

里面调的都是工具方法。




第一集,[No.1] jQuery源码解析—搭建框架(1)。

别走开,下集更精彩。

喜欢文章的小伙伴,

希望大家多多转发分享,

你的分享就是我的动力!

喜欢 分享 or
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,914评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,935评论 2 383
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,531评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,309评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,381评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,730评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,882评论 3 404
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,643评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,095评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,448评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,566评论 1 339
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,253评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,829评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,715评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,945评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,248评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,440评论 2 348

推荐阅读更多精彩内容

  • 1.JQuery 基础 改变web开发人员创造搞交互性界面的方式。设计者无需花费时间纠缠JS复杂的高级特性。 1....
    LaBaby_阅读 1,167评论 0 1
  • 1.JQuery 基础 改变web开发人员创造搞交互性界面的方式。设计者无需花费时间纠缠JS复杂的高级特性。 1....
    LaBaby_阅读 1,330评论 0 2
  • 今天,更新有点晚, 但是干货不怕晚, 接着昨天讲得讲, 把第一段讲的没讲完的继续讲解。 (function(){ ...
    web_无笙阅读 379评论 0 2
  • 在线阅读 http://interview.poetries.top[http://interview.poetr...
    程序员poetry阅读 114,306评论 24 450
  • 你是否还有这样的心情:行程中,偶然的憋见路旁的一簇花,惦念不忘?或者某天打算再去寻它? 你当然没有。 ...
    黄飞蝗阅读 99评论 13 7