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 相关文章推荐
通过js为元素添加多项样式,浏览器全兼容写法
Aug 30 Javascript
每天一篇javascript学习小结(基础知识)
Nov 10 Javascript
Angularjs中的页面访问权限怎么设置
Nov 11 Javascript
Jquery Easyui对话框组件Dialog使用详解(14)
Dec 19 Javascript
jQuery弹出窗口打开链接的实现代码
Dec 24 Javascript
Javascript中的神器——Promise
Feb 08 Javascript
前端框架学习总结之Angular、React与Vue的比较详解
Mar 14 Javascript
js获取元素的偏移量offset简单方法(必看)
Jul 05 Javascript
three.js实现3D视野缩放效果
Nov 16 Javascript
vuejs实现ready函数加载完之后执行某个函数的方法
Aug 31 Javascript
Nuxt.js SSR与权限验证的实现
Nov 21 Javascript
超好用的jQuery分页插件jpaginate用法示例【附源码下载】
Dec 06 jQuery
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
新安装的MySQL数据库需要注意的安全知识
2008/07/30 PHP
jQuery向下滚动即时加载内容实现的瀑布流效果
2016/01/07 PHP
关于PHP文件的自动运行方法分析
2016/05/13 PHP
Laravel Eloquent分表方法并使用模型关联的实现
2019/11/25 PHP
css3元素简单的闪烁效果实现(html5 jquery)
2013/12/28 Javascript
Node.js实现的简易网页抓取功能示例
2014/12/05 Javascript
bootstrap datepicker 与bootstrapValidator同时使用时选择日期后无法正常触发校验的解决思路
2016/09/28 Javascript
jQuery实现可移动选项的左右下拉列表示例
2016/12/26 Javascript
jquery 实现复选框的全选操作实例代码
2017/01/24 Javascript
详解如何实现一个简单的 vuex
2018/02/10 Javascript
快速解决vue-cli在ie9+中无效的问题
2018/09/04 Javascript
Vue 全家桶实现移动端酷狗音乐功能
2018/11/16 Javascript
js判断鼠标移入移出方向的方法
2020/06/24 Javascript
Vue实现穿梭框效果
2020/09/30 Javascript
Python 命令行参数sys.argv
2008/09/06 Python
Python正则表达式知识汇总
2017/09/22 Python
python json.loads兼容单引号数据的方法
2018/12/19 Python
pandas数据集的端到端处理
2019/02/18 Python
解决Python对齐文本字符串问题
2019/08/28 Python
使用 Supervisor 监控 Python3 进程方式
2019/12/05 Python
Django DRF认证组件流程实现原理详解
2020/08/17 Python
HTML5实现桌面通知 提示功能
2017/10/11 HTML / CSS
香港时装购物网站:ZALORA香港
2017/04/23 全球购物
美国最便宜的旅游网站:CheapTickets
2017/07/09 全球购物
英国邮购活的植物主要供应商:Gardening Direct
2019/01/28 全球购物
在Ajax应用中信息是如何在浏览器和服务器之间传递的
2016/05/31 面试题
母亲节演讲稿范文
2014/01/02 职场文书
网上签名寄语活动留言
2014/01/18 职场文书
小学中秋节活动方案
2014/02/06 职场文书
关于读书的演讲稿
2014/05/07 职场文书
安全生产承诺书范文
2014/05/22 职场文书
2015年端午节活动方案
2015/05/05 职场文书
Python中os模块的简单使用及重命名操作
2021/04/17 Python
python之json文件转xml文件案例讲解
2021/08/07 Python
利用js实现简单开关灯代码
2021/11/23 Javascript
vue-cli3.x配置全局的scss的时候报错问题及解决
2022/04/30 Vue.js