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 相关文章推荐
javascript StringBuilder类实现
Dec 22 Javascript
js模拟C#中List的简单实例
Mar 06 Javascript
JavaScript中日期的相关操作方法总结
Oct 24 Javascript
jQuery插件支持同一页面被多次调用
Feb 14 Javascript
JS组件Bootstrap dropdown组件扩展hover事件
Apr 17 Javascript
jQuery height()、innerHeight()、outerHeight()函数的区别详解
May 23 Javascript
教你JS中的运算符乘方、开方及变量格式转换
Aug 09 Javascript
深入学习Bootstrap表单
Dec 13 Javascript
详解如何使用Vue2做服务端渲染
Mar 29 Javascript
Angular 项目实现国际化的方法
Jan 08 Javascript
JavaScript实现获取select下拉框中第一个值的方法
Feb 06 Javascript
使用node打造自己的命令行工具方法教程
Mar 26 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通过smtp邮件验证登陆的方法
2016/05/11 PHP
JavaScript中的new的使用方法与注意事项
2007/05/16 Javascript
JavaScript 字符编码规则
2009/05/04 Javascript
Javascript UrlDecode函数代码
2010/01/09 Javascript
JS计算网页停留时间代码
2014/04/28 Javascript
JavaScript取得WEB安全颜色列表的方法
2015/07/14 Javascript
纯javascript实现的小游戏《Flappy Pig》实例
2015/07/27 Javascript
详解JavaScript语言的基本语法要求
2015/11/20 Javascript
JS中位置与大小的获取方法
2016/11/22 Javascript
使用ionic播放轮询广告的实现方法(必看)
2017/04/24 Javascript
Angular2学习教程之TemplateRef和ViewContainerRef详解
2017/05/25 Javascript
在bootstrap中实现轮播图实例代码
2017/06/11 Javascript
详解vue表单——小白速看
2018/04/08 Javascript
小程序登录之支付宝授权的实现示例
2019/12/13 Javascript
python抽象基类用法实例分析
2015/06/04 Python
轻松掌握python设计模式之策略模式
2016/11/18 Python
python使用opencv读取图片的实例
2017/08/17 Python
使用Python将字符串转换为格式化的日期时间字符串
2019/09/01 Python
pytorch实现CNN卷积神经网络
2020/02/19 Python
python GUI库图形界面开发之PyQt5布局控件QVBoxLayout详细使用方法与实例
2020/03/06 Python
Python xpath表达式如何实现数据处理
2020/06/13 Python
如何使用PyCharm引入需要使用的包的方法
2020/09/22 Python
CSS3的常见transformation图形变化用法小结
2016/05/13 HTML / CSS
你不知道的5个HTML5新功能
2016/06/28 HTML / CSS
基于HTML5+CSS3实现简单的时钟效果
2017/09/11 HTML / CSS
Strawberrynet草莓网新加坡站:护肤、彩妆、香水及美发产品
2018/08/31 全球购物
某个公司的Java笔面试题
2016/03/11 面试题
专科毕业生求职简历的自我评价
2013/10/12 职场文书
秋天的怀念教学反思
2014/04/28 职场文书
小学教师2014年度工作总结
2014/12/03 职场文书
淮阳太昊陵导游词
2015/02/10 职场文书
2016会计专业自荐信范文
2016/01/28 职场文书
某某店铺的开业庆典主持词范本
2019/11/25 职场文书
Golang 空map和未初始化map的注意事项说明
2021/04/29 Golang
Python开发工具Pycharm的安装以及使用步骤总结
2021/06/24 Python
MySQL实现配置主从复制项目实践
2022/03/31 MySQL