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 相关文章推荐
探讨JQUERY JSON的反序列化类 using问题的解决方法
Dec 19 Javascript
easyui Droppable组件实现放置特效
Aug 19 Javascript
JS封装cookie操作函数实例(设置、读取、删除)
Nov 17 Javascript
JS Array.slice 截取数组的实现方法
Jan 02 Javascript
JavaScript操作class和style样式代码详解
Feb 13 Javascript
JavaScript实现斗地主游戏的思路
Feb 29 Javascript
JavaScript对象数组排序实例方法浅析
Jun 15 Javascript
jQuery实现点击表格单元格就可以编辑内容的方法【测试可用】
Aug 01 Javascript
PHP实现本地图片上传和验证功能
Feb 27 Javascript
Django中使用jquery的ajax进行数据交互的实例代码
Oct 15 jQuery
Node.js中package.json中库的版本号(~和^)
Apr 02 Javascript
解决vue项目运行npm run serve报错的问题
Oct 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
成为好程序员必须避免的5个坏习惯
2014/07/04 PHP
一个刚完成的layout(拖动流畅,不受iframe影响)
2007/08/17 Javascript
javascript获取当前ip的代码
2009/05/10 Javascript
深入理解javascript学习笔记(一) 编写高质量代码
2012/08/09 Javascript
JavaScript调用浏览器打印功能实例分析
2015/07/17 Javascript
在for循环中length值是否需要缓存
2015/07/27 Javascript
基于jquery实现最简单的选项卡切换效果
2016/05/08 Javascript
js与applet相互调用的方法
2016/06/22 Javascript
Bootstrap如何激活导航状态
2017/03/22 Javascript
JS实现给json数组动态赋值的方法示例
2020/03/19 Javascript
JS中图片压缩的方法小结
2017/11/14 Javascript
优雅的在React项目中使用Redux的方法
2018/11/10 Javascript
基于three.js实现的3D粒子动效实例代码
2019/04/09 Javascript
D3.js(v3)+react 实现带坐标与比例尺的柱形图 (V3版本)
2019/05/09 Javascript
浅析vue中的provide / inject 有什么用处
2019/11/10 Javascript
JS前端模块化原理与实现方法详解
2020/03/17 Javascript
python 多线程应用介绍
2012/12/19 Python
如何使用 Pylint 来规范 Python 代码风格(来自IBM)
2018/04/06 Python
Python实现重建二叉树的三种方法详解
2018/06/23 Python
Django中使用第三方登录的示例代码
2018/08/20 Python
python学习--使用QQ邮箱发送邮件代码实例
2019/04/16 Python
python用quad、dblquad实现一维二维积分的实例详解
2019/11/20 Python
Python 之 Json序列化嵌套类方式
2020/02/27 Python
python 服务器运行代码报错ModuleNotFoundError的解决办法
2020/09/16 Python
HTML5 Blob对象的具体使用
2020/05/22 HTML / CSS
Clarks鞋美国官网:全球领军鞋履品牌
2017/05/13 全球购物
资生堂英国官网:Shiseido英国
2020/12/30 全球购物
西式婚礼证婚词
2014/01/12 职场文书
网上快餐厅创业计划书
2014/02/01 职场文书
怎样填写就业意向
2014/04/02 职场文书
销售2014年度工作总结
2014/12/08 职场文书
教师个人考察材料
2014/12/16 职场文书
工作表扬信范文
2015/01/17 职场文书
2015夏季作息时间调整通知
2015/04/24 职场文书
学校世界艾滋病日宣传活动总结
2015/05/05 职场文书
公司岗位说明书
2015/10/08 职场文书