之前用jQuery库写了两个小例子(结合Apache、PHP实现的简易聊天室以及音乐播放器),详见我的上两篇博客jQuery aJax技术以及PHP实现简单聊天室、 利用jQuery实现音乐播放器。为了更加深入了解jQuery库的架构以及巩固原生JS的基础和深度,决定刨一刨jQuery源码。

jQuery源码架构

首先,jQuery源码的整体构架如下:(此图来源于“jQuery技术内幕:深入解析jQuery架构设计与实现原理” 高云)

  1. 入口模块
    jQuery的入口模块,主要是创建jQuery对象。这块其实是比较绕的,涉及到JS 原型的概念。
  2. 底层模块
    jQuery的底层模块主要包括一些工具方法,以及比较底层的,用的比较多的函数方法。比如onConflict(),isArray(),isFunction(),makkeArray()等等,建议大家可以看看jQuery API手册
  3. 功能模块
    这块应该是我们平时用jQuery库用的比较多的方法。比如aJax请求,动画,事件处理,样式设置与获取,属性设置与获取等等,这些方法都依赖于底层模块的工具方法和浏览器功能测试,主要用于浏览器检测,解决浏览器兼容问题。同时,功能模块不同的方法也依赖于底层模块的各个不同方法。
    源码结构如下:
(function (window, undefined){//创建jQeury对象var jQuery = function(){var jQuery = function(selector, context){return new jQuery.fn.init(selector, context);}jQuery.fn = jQuery.prototype = function(){//原型上的方法,即所有jQuery对象都可以共享的方法和属性}jQuery.fn.init.prototype = jQuery.fn;window.jQeury = window.$ = jQuery;}();
})(window);

入口模块

本篇博客主要想解析的是入口模块。
首先是一个立即执行函数

(function (window, undefined){//创建jQeury对象
})(window);

JS高程中函数-闭包这一章节就有讲到,原生JS中没有块级作用域的概念,但可以利用立即执行函数来模拟一个私有作用域。这样做是为了保证变量不被外面的变量影响。

另一方面,为什么要传window实参来执行函数呢?
window是顶级作用域,就算不传window参数进去,也同样可以访问到,但这就可能需要沿着作用域链一直去查找,导致时间比较长,而传入window参数之后,可以保证很快访问到。

下来在立即执行函数里面,是jQuery对象的创建。想想我们如何利用jQuery库来创建jQuery对象的?
直接$函数就能创建。

$("<div>jQuery源码</div>");

而在原生JS中,创建一个对象都是用new 和构造函数来实现的,那么看看jQuery源码中是如何做到的?

var jQuery = function( selector, context ) {// The jQuery object is actually just the init constructor 'enhanced'return new jQuery.fn.init( selector, context, rootjQuery );}

它是利用jQuery.fn.init方法来作为构造函数创建jQuery对象的。创建任何一个对象时,都会有与之对应的一个原型对象。为了使得以这个构造函数创建的每一个对象都有相同的属性和方法,要将其加到能连到jQuery的原型链上。可能这句话听着不是很明白,下面画一个图可以直观的缕一下:
在看到上面new jQuery.fn.init( selector, context, rootjQuery )操作之后,我们脑海中应该会有下面这幅图的样子:


下来我们想,如何将真正利用jQuery.fn.init()构造的对象与jQuery对象联系?即每一个构造出来的对象都可以共享一些相同的方法和属性,JS中原型链的概念可以帮助解决。因此,有了下面这幅图:

源码上如何实现?

jQuery.fn = jQuery.prototype = function(){init: function(selector, context, rootjQuery){//创建jQuery对象}//当然还有别的方法和属性
}jQuery.fn.init.prototype = jQuery.fn;

这样就可以保证创建出的jQuery对象可以连到jQuery原型链上了。

为了更好的理解,可能用代码来说话最有说服力。我简单实现了这一段。一方面,这样看着比源码简要的多;另一方面,源码中init构造函数涉及到很多种情况,这里先不介绍,仅用一小段代码来代替。
jQuery.lh.1.1.0.js

(function(window, undefined){var jQuery = (function(){var jQuery = function(selector, context){return new jQuery.fn.init(selector, context);}jQuery.fn = jQuery.prototype = {constructor: jQuery,init : function(selector, context){this.person = selector;this.name = context;return this;},sayHello : function(){console.log(this.name);}};jQuery.fn.init.prototype = jQuery.fn;window.$ = window.jQuery = jQuery;})();
})(window);

test.html

<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8"><script src="jQuery.lh.1.1.0.js"></script><script>var o = jQuery("Hello", "Name");var s = $("LiuHuan", "Cname");</script></head><body></body>
</html>

浏览器中调试模式下,o和s都分别是对象,有person和name两个属性,并且有sayHello方法。

现在假设注释掉jQuery.fn.init.prototype = jQuery.fn;这一句代码,那么如果执行o.sayHello()会出现错误。原因就是因为实际用init构造的对象没有指回到jQuery对象的原型上,因此不能在原型链上访问到。

jQuery源码阅读(一)---jQuery源码整体架构相关推荐

  1. 封装成jar包_通用源码阅读指导mybatis源码详解:io包

    io包 io包即输入/输出包,负责完成 MyBatis中与输入/输出相关的操作. 说到输入/输出,首先想到的就是对磁盘文件的读写.在 MyBatis的工作中,与磁盘文件的交互主要是对 xml配置文件的 ...

  2. 以太坊源码阅读5——POW源码分析

    以太坊源码阅读5--POW源码分析 介绍 POW,proof of work,即工作量证明,是著名公bitcoin所采用的共识算法.简单来说,pow就是一个证明,由矿工使用算力进行计算(挖矿),竞争记 ...

  3. MyBatis源码分析(一)MyBatis整体架构分析

    文章目录 系列文章索引 一.为什么要用MyBatis 1.原始JDBC的痛点 2.Hibernate 和 JPA 3.MyBatis的特点 4.MyBatis整体架构 5.MyBatis主要组件及其相 ...

  4. ZooKeeper源码阅读心得分享+源码基本结构+源码环境搭建

    首发CSDN:徐同学呀,原创不易,转载请注明源链接.我是徐同学,用心输出高质量文章,希望对你有所帮助. 一.心得分享 如何阅读ZooKeeper源码?从哪里开始阅读?最近把ZooKeeper源码看了个 ...

  5. jQuery-1.9.1源码分析系列(一)整体架构

    不废话,直接上关键.这个系列中有好些直接借用别人的资料,我将他们整合在自认为比较合理的地方.所以在此先谢谢那些前辈. 注意:后续系列中jQuery实例多用$(...)来表示 1.    初始化与链式调 ...

  6. Mina源码阅读笔记(一)-整体解读

    2019独角兽企业重金招聘Python工程师标准>>> 今天的这一节,将从整体上对mina的源代码进行把握,网上已经有好多关于mina源码的阅读笔记,但好多都是列举了一下每个接口或者 ...

  7. MongoDB源码阅读之ReplSet源码分析

    1. ReplSet源码结构 rs_config.h replSet间同步设置的工具类 rs_member.h 心跳检测类和replSet成员状态的定义 rs_sync.h 同步数据类 rs.h 定义 ...

  8. mybatis源码阅读系列之源码下载

    一.百度输入mybatis 二.选择Git 项目 三.选择 mybatis 四.拉到页面最下面,选择最新 下载jar包 下载源码

  9. Scrapy源码阅读分析_5_Scrapy-settings源码分析

    From:https://blog.csdn.net/weixin_37947156/article/details/74972642 The global defaults are located ...

  10. mysql源码分析——InnoDB的内存应用整体架构源码

    一.基本介绍 在前面基本把几个缓冲的创建应用的源码搞定了.但是在宏观层次上的使用是怎么设计的呢?这篇就分析一下Buffer Pool的整体应用框架,其它的如果有时间再慢慢一一补齐,重点还是要把MySq ...

最新文章

  1. 【微服务架构】SpringCloud之路由网关(zuul)
  2. 深入理解Spring的ImportSelector接口
  3. 阿里云OSS存储开发
  4. Oracle over函数学习
  5. LeetCode之Number Complement
  6. 【C++进阶】 遵循TDD原则,实现平面向量类(Vec2D)
  7. PHP按比例生成縮略圖片
  8. 【吼吼睡cocos2d学习笔记】第五章 - loading场景以及其他
  9. PHP underlying structure
  10. python 异常处理模块_Python Exceptions 异常处理全过程以及异常模块详细解析
  11. 检查密码 (15 分)
  12. 提高专业技能之 “完整DataSheet”
  13. java对象创建、对象内存布局、对象的访问定位、句柄池、直接指针
  14. RTI_DDS自定义插件开发 6 监听者
  15. 移动办公系统现状分析
  16. UWP 写入图片 Exif 信息
  17. 离散数学-各种关联词的符号化
  18. 实验11-1-7 藏头诗 (15 分)
  19. 第38.1节 osg加载大tif-编译vpb
  20. 拒绝同质化,主题酒店大势所趋

热门文章

  1. 零信任时代企业如何提升权限的安全?从浏览器小程序说起
  2. RoboMaster电机驱动
  3. SEP14MP2卸载重装
  4. java开发之权限管理详解
  5. 怎么做 空间杜宾模型_利用STATA创建空间权重矩阵及空间杜宾模型计算命令
  6. 易宝php测试账号和密匙,易宝php支付
  7. linux 锐捷客户端 脚本,基于802.1x的锐捷linux客户端
  8. 单片机控制直流电机正反转
  9. 多媒体计算机教室的使用与管理,焦作师范高等专科学校多媒体教室使用管理规定...
  10. 一些osu的皮肤下载