jQuery内部原理和实现方式浅析


Posted in Javascript onFebruary 03, 2015

这段时间在学习研究jQuery源码,受益于jQuery日益发展强大,研究jQuery的大牛越来越多,学习的资料也比前两年好找了,有很多非常不错的资源,如高云的jQuery1.6.1源码分析系列。这些教程非常细致的分析了jQuery内部原理和实现方式,对学习和理解jQuery有非常大的帮助。但是个人认为很多教程对jQuery的整体结果把握不足,本人试图从整体来阐述一下jQuery的内部实现。

大家知道,调用jQuery有两种方式,一种是高级的实现,通过传递一个参数实现DOM选择,如通过$(“h1″)选择所有的h1元素,第二种是较为低级的实现,如果通过$.ajax实现ajax的操作。那么,这两种方式到底有何不同?用typeof函数检测$(‘h1′)和$.ajax,类型分别为object和function,稍微学过jQuery的都知道或者听过过,前者返回的是一个jQuery对象,那么jQuery对象是什么,它和jQuery是什么关系呢?我们先来通过for(var i in $(”)) document.write(i+” :::”+$(“”)[i]+””);打印一下jQuery对象的属性和对应的值,可以看到它有100多个属性,通过console输入$(“*”)可以看到大部分属性是继承自jQuery原型的属性,jQuery对象实际上是这样一个对象:

jQuery内部原理和实现方式浅析

所以我们来推测,jQuery的实现可能是类似这样的:

function jQuery(){
 this[0]="Some DOM Element";
 this[1]="Some DOM Element";
 this[2]="Some DOM Element";
 this.length=3;
 this.prevObject="Some Object";
 this.context="Some Object";
 this.selector="Some selector";
}
jQuery.prototype={
get:function(){},
each:function(){},
......
}

这些代码通过new操作符就就能创建出拥有上述属性的jQuery对象,但是实际上我们调用jQuery创建jQuery对象时并没有使用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=jQuery.prototype={
 jquery: core_version,
 init:function(selector,context){
 //some code
 return this;
 }
 //some code there
 //......
}
jQuery.fn.init.prototype=jQuery.fn;

这里有几点做得非常巧妙的地方,第一点是通过jQuery原型属性的init方法来创建对象来达到不用new创建对象的目的,第二点是对init方法内this指向的处理。我们知道,通过调用init返回一个jQuery的实例,那么这个实例就必须要继承jQuery.prototype的属性,那么init里面这个this, 就继承jQuery.prototype的属性。但是init里面的this,受制于作用域的限制,并不能访问jQuery.prototype其它的属性,jQuery通过一句'jQuery.fn.init.prototype=jQuery.fn'把它的原型指向jQuery.fn,这样以来,init产生的jQuery对象就拥有了jQuery.fn的属性。

到这里,一个jQuery的基本原型就浮出水面了。这里有两个对象,一个是jQuery这个构造函数,另外一个是这个构造函数产生的对象(我们称之为jQuery对象,它和普通对象没有什么区别), 如下关系图:

jQuery内部原理和实现方式浅析

可以看到jQuery构造函数和jQuery.prototype均有各自的属性和方法,两者的调用方法各不一样,这两个对象都有一个extend方法,都是用来扩展自身的属性和方法,在jQuery内部,extend的实现实际是靠一样的代码, 将在后面的源码分析中做以详细的分析。

Javascript 相关文章推荐
JQUBAR1.1 jQuery 柱状图插件发布
Nov 28 Javascript
基于JavaScript实现通用tab选项卡(通用性强)
Jan 07 Javascript
AngularJS基础 ng-keypress 指令简单示例
Aug 02 Javascript
基于JavaScript实现自定义滚动条
Jan 25 Javascript
微信小程序 支付功能实现PHP实例详解
May 12 Javascript
详解PHP后期静态绑定分析与应用
Mar 21 Javascript
vue.js中实现登录控制的方法示例
Apr 23 Javascript
深入理解JavaScript 中的执行上下文和执行栈
Oct 23 Javascript
微信小程序实现文字从右向左无限滚动
Nov 18 Javascript
深入了解JavaScript 的 WebAssembly
Jun 15 Javascript
react MPA 多页配置详解
Oct 18 Javascript
Element图表初始大小及窗口自适应实现
Jul 10 Javascript
jQuery中extend函数的实现原理详解
Feb 03 #Javascript
jQuery中noconflict函数的实现原理分解
Feb 03 #Javascript
jQuery中的pushStack实现原理和应用实例
Feb 03 #Javascript
JavaScript闭包详解
Feb 02 #Javascript
js实现浏览器窗口大小被改变时触发事件的方法
Feb 02 #Javascript
javascript的switch用法注意事项分析
Feb 02 #Javascript
jQuery实现长按按钮触发事件的方法
Feb 02 #Javascript
You might like
PHP 第二节 数据类型之转换
2012/04/28 PHP
thinkphp中多表查询中防止数据重复的sql语句(必看)
2016/09/22 PHP
TopList标签和JavaScript结合两例
2007/08/12 Javascript
基于jquery+thickbox仿校内登录注册框
2010/06/07 Javascript
基于jquery的防止大图片撑破页面的实现代码(立即缩放)
2011/10/24 Javascript
js onload事件不起作用示例分析
2013/10/09 Javascript
js中函数调用的两种常用方法使用介绍
2014/07/17 Javascript
PHP配置文件php.ini中打开错误报告的设置方法
2015/01/09 PHP
自己编写的支持Ajax验证的JS表单验证插件
2015/05/15 Javascript
Node.js DES加密的简单实现
2016/07/07 Javascript
利用Vue.js指令实现全选功能
2016/09/08 Javascript
微信小程序开发之大转盘 仿天猫超市抽奖实例
2016/12/08 Javascript
详解前端路由实现与react-router使用姿势
2017/08/07 Javascript
JS实现颜色的10进制转化成rgba格式的方法
2017/09/04 Javascript
Element输入框带历史查询记录的实现示例
2019/01/15 Javascript
Node.JS枚举统计当前文件夹和子目录下所有代码文件行数
2019/08/23 Javascript
浅谈bootstrap layer.open中end的使用方法
2019/09/12 Javascript
vuecli项目构建SSR服务端渲染的实现
2020/10/30 Javascript
[49:18]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 OG vs TNC
2018/04/01 DOTA
python 文件与目录操作
2008/12/24 Python
Django中对通过测试的用户进行限制访问的方法
2015/07/23 Python
动感网页相册 python编写简单文件夹内图片浏览工具
2016/08/17 Python
python使用matplotlib绘图时图例显示问题的解决
2017/04/27 Python
详解Golang 与python中的字符串反转
2017/07/21 Python
pandas.dataframe按行索引表达式选取方法
2018/10/30 Python
python实现狄克斯特拉算法
2019/01/17 Python
python3.x中安装web.py步骤方法
2020/06/23 Python
HTML5基于flash实现播放RTMP协议视频的示例代码
2020/12/04 HTML / CSS
法国和欧洲海边和滑雪度假:Pierre & Vacances
2017/01/04 全球购物
竞聘医务工作人员的自我评价分享
2013/11/04 职场文书
应用数学自荐书范文
2013/11/24 职场文书
防灾减灾标语
2014/10/07 职场文书
遗失说明具结保证书
2015/02/26 职场文书
《自然之道》读后感3篇
2019/12/17 职场文书
python入门学习关于for else的特殊特性讲解
2021/11/20 Python
铁头也玩根德 YachtBoy YB-230......
2022/04/05 无线电