jQuery 源码分析(一) 代码结构
jQuery是一个Javascript库,它支持链式操作方式,即对发生在同一个JQuery对象上的一组动作,可以直接接连写无需要重复获取对象。这一特点使得JQuery的代码无比优雅,而且有强大的选择器,出色的DOM操作,可靠的事件处理机制,完善的Ajax,关键是有出色的浏览器兼容性,开发项目时可以不用考虑兼容性,因为jQuery已经替我们都修正好了,最后还有一点是jQuery有非常多的插件,功能非常丰富。
jQuery和Vue(包括react、angular)的区别就不说了,网上一大堆哈哈,前者是MVC模式,后者是MVVM模式,MVVM模式的出现不是说为了取代MVC模式的,它们是可以共同存在的,很多时候还是使用mvc模式更方便,对于一些数据交互比较多的可以使用vue之类的脚手架来进行开发项目,难度相比较也有点大
jQuery的代码结构相比较简单,就是一个匿名函数,将入口挂载到window.$和window.jQuery属性上,我们模拟一下jQuery的结构,由浅入深,如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<script>
(function(window,undefined){
var jQuery = (function(){
return 'Hello jQuery';
})()
window.jQuery = window.$ = jQuery;
})(window)
console.log($)
</script>
</body>
</html>
writer by:大沙漠 QQ:22969969
就是定义一个匿名函数,内部再定义一个jQuery变量,值为一个立即执行表达式,最后将值挂载到window.jQuery和window.$上,打印出来的如下:

实际上当然不可能直接返回一个字符串,其实在这个立即执行表达式里,会执行new jQuery.fn.init()创建一个函数对象,最后返回改函数对象,我们加深一点代码,和jQuery内部一样,如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<p id="p">123</p>
<script>
(function(window,undefined){
var jQuery = (function(){
var jQuery = function(selector){ //再定义一个函数,内部返回new一个jQuery.fn.init对象,并返回
return new jQuery.fn.init(selector)
}
jQuery.fn={
init:function(selector){
this[0] = selector;
return this
}
}
return jQuery;
})()
window.jQuery = window.$ = jQuery;
})(window) console.log($('p'))
console.log($('p')[0])
</script> </body>
</html>
打印如下:

第一行输出是$('p')对象,第二行就是p这个Dom节点引用了,第一行输出是不是和真实的jQuery对象很像呢,我们用真实的jQuery打印看看:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script src="http://libs.baidu.com/jquery/1.7.1/jquery.min.js"></script>
</head>
<body>
<p id="p">123</p>
<script>
console.log($(p))
console.log($(p)[0])
</script>
</body>
</html>
输出如下:

可以看到真实的jQuery返回的也是一个init对象,第二行输出么就是一摸一样了。
jQuery的代码结构就是这样的,最后返回的其实内部的jQuery.fn.init对象,然后会把jQuery.fn设置为jQuery.fn.init的原型,最后在jQuery.fn或jQuery.fn.prototype上设置大量的属性和方法,这些属性和方法就是jQuery对外的属性和方法,供我们使用了。
jQuery的代码结构按照功能不同分为三部分:
入口模块(用于构造jQUery对象)
底层支持模块(供功能模块使用的)
功能模块(最后实现的操作)
底层支持模块又分为:
选择器模块
浏览器功能测试
异步队列
数据缓存和队列模块
功能模块又细分为
属性操作
事件系统
DOM遍历
DOM操作
样式操作CSS
异步请求
动画模块
后面慢慢介绍每个模块,每个API的用法和原理实现。
jQuery 源码分析(一) 代码结构的更多相关文章
- Vue.js 源码分析(一) 代码结构
关于Vue vue是一个兴起的前端js库,是一个精简的MVVM.MVVM模式是由经典的软件架构MVC衍生来的,当View(视图层)变化时,会自动更新到ViewModel(视图模型),反之亦然,View ...
- [转] jQuery源码分析-如何做jQuery源码分析
jQuery源码分析系列(持续更新) jQuery的源码有些晦涩难懂,本文分享一些我看源码的方法,每一个模块我基本按照这样的顺序去学习. 当我读到难度的书或者源码时,会和<如何阅读一本书> ...
- MySQL源码分析以及目录结构 2
原文地址:MySQL源码分析以及目录结构作者:jacky民工 主要模块及数据流经过多年的发展,mysql的主要模块已经稳定,基本不会有大的修改.本文将对MySQL的整体架构及重要目录进行讲述. 源码结 ...
- MySQL源码分析以及目录结构
原文地址:MySQL源码分析以及目录结构作者:jacky民工 主要模块及数据流经过多年的发展,mysql的主要模块已经稳定,基本不会有大的修改.本文将对MySQL的整体架构及重要目录进行讲述. 源码结 ...
- jQuery 源码分析 8: 回头看jQuery的构造器(jQuery.fn,jQury.prototype,jQuery.fn.init.prototype的分析)
在第一篇jQuery源码分析中,简单分析了jQuery对象的构造过程,里面提到了jQuery.fn.jQuery.prototype.jQuery.fn.init.prototype的关系. 从代码中 ...
- ffplay源码分析2-数据结构
ffplay是FFmpeg工程自带的简单播放器,使用FFmpeg提供的解码器和SDL库进行视频播放.本文基于FFmpeg工程4.1版本进行分析,其中ffplay源码清单如下: https://gith ...
- jQuery源码分析-each函数
本文部分截取自且行且思 jQuery.each方法用于遍历一个数组或对象,并对当前遍历的元素进行处理,在jQuery使用的频率非常大,下面就这个函数做了详细讲解: 复制代码代码 /*! * jQuer ...
- jQuery源码分析系列
声明:本文为原创文章,如需转载,请注明来源并保留原文链接Aaron,谢谢! 版本截止到2013.8.24 jQuery官方发布最新的的2.0.3为准 附上每一章的源码注释分析 :https://git ...
- storm源码之storm代码结构【译】【转】
[原]storm源码之storm代码结构[译] 说明:本文翻译自Storm在GitHub上的官方Wiki中提供的Storm代码结构描述一节Structure of the codebase,希望对正 ...
随机推荐
- gRPC+gRPC Gateway+swagger小记
前言 本文记录了grpc-gateway的简单使用. 定义proto 先来看看最常规的 syntax = "proto3"; package protos; service Gre ...
- Java8接口新特性
概述 Java 8中,你可以为接口添加静态方法和默认方法.从技术角度来说,这是完全合法的,只是它看起来违反了接口作为一个抽象定义的理念.猜想设计初衷可能使为了兼容8以下的jdk Java8出来了个函数 ...
- ASH裸数据dba_hist_active_sess_history的分析
之前在一则案例<记录一则enq: TX - row lock contention的分析过程>使用过这种方法. 因为最近故障处理经常会用到这类查询进行ASH裸数据的分析,下面以m_ash0 ...
- Python爬取酷狗飙升榜前十首(100)首,写入CSV文件
酷狗飙升榜,写入CSV文件 爬取酷狗音乐飙升榜的前十首歌名.歌手.时间,是一个很好的爬取网页内容的例子,对爬虫不熟悉的读者可以根据这个例子熟悉爬虫是如何爬取网页内容的. 需要用到的库:requests ...
- C#命名规则和设计规则
Pascal 将每个单词的第一个字符大写.遇到两个字母的首字母缩略词时,两个字母都要大写 命名空间:使用公司名作为前缀.在第二级名称中使用稳定的与版本无关的产品名称 类型:名词或名词短语命名 结构:名 ...
- C#委托内部使用局部的变量的问题
一. 引子 先来看如下代码: ; Action action1 = () => { Console.WriteLine("打印一下i的值:" + i); }; i = ; A ...
- java基础(12):构造方法、this、super
1. 构造方法 我们对封装已经有了基本的了解,接下来我们来看一个新的问题,依然以Person为例,由于Person中的属性都被private了,外界无法直接访问属性,必须对外提供相应的set和get方 ...
- LooseVersion()使用及.__version__版本号的获取
我简单看了distutils库,但发现目前还用不到,感觉有些复杂.因此我简单复制了别人的介绍,如下: Distutils可以用来在Python环境中构建和安装额外的模块.新的模块可以是纯Python的 ...
- PHP面试题2019年滴滴出行工程师面试题及答案解析
一.单选题(共30题,每题5分) 1.下列关于PHP垃圾回收的说法,错误的是? A.开启/关闭垃圾回收机制可以通过修改php配置实现 B.可以在程序中使用gc_enable() 和 gc_disabl ...
- E203 CSR rtl实现分析
CSR状态控制寄存器,每个hart都有自己的CSR.对于每个hart,可以配置的状态寄存器是4k.CSR寄存器的功能见:https://www.cnblogs.com/mikewolf2002/p/1 ...