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 异步页面查询实现代码(asp.net)
May 26 Javascript
一个简单的js动画效果代码
Jul 20 Javascript
当达到输入长度时表单自动切换焦点
Apr 06 Javascript
jquery实现标签支持图文排列带上下箭头按钮的选项卡
Mar 14 Javascript
jQuery中 attr() 方法使用小结
May 03 Javascript
js实现拖拽效果(构造函数)
Dec 14 Javascript
JS实现可编辑的后台管理菜单功能【附demo源码下载】
Sep 13 Javascript
Angularjs手动解析表达式($parse)
Oct 12 Javascript
jsp 网站引入外部css或者js失效问题解决
Oct 31 Javascript
js获取浏览器和屏幕的各种宽度高度
Feb 22 Javascript
js css自定义分页效果
Feb 24 Javascript
微信小程序新闻网站详情页实例代码
Jan 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脚本的10个技巧(4)
2006/10/09 PHP
php ignore_user_abort与register_shutdown_function 使用方法
2009/06/14 PHP
完美解决thinkphp验证码出错无法显示的方法
2014/12/09 PHP
PHP实现数组array转换成xml的方法
2016/07/19 PHP
简单谈谈PHP中的Reload操作
2016/12/12 PHP
腾讯的ip接口 方便获取当前用户的ip地理位置
2010/11/25 Javascript
JavaScript词法作用域与调用对象深入理解
2012/11/29 Javascript
IE下window.onresize 多次调用与死循环bug处理方法介绍
2013/11/12 Javascript
js与jquery实时监听输入框值的oninput与onpropertychange方法
2015/02/05 Javascript
JavaScript中标识符提升问题
2015/06/11 Javascript
学习javascript面向对象 javascript实现继承的方式
2016/01/04 Javascript
jquery实现多次上传同一张图片
2017/01/09 Javascript
jQuery中extend函数简单用法示例
2017/10/11 jQuery
js 提取某()特殊字符串长度的实例
2017/12/06 Javascript
JavaScript设计模式之代理模式简单实例教程
2018/07/03 Javascript
微信小程序实现星星评价效果
2018/11/02 Javascript
浅谈Vue.js组件(二)
2019/04/09 Javascript
微信小程序在ios下Echarts图表不能滑动的问题解决
2019/07/10 Javascript
js实现星星打分效果
2020/07/05 Javascript
vue 在methods中调用mounted的实现操作
2020/08/07 Javascript
vue3.0实现点击切换验证码(组件)及校验
2020/11/18 Vue.js
Python批量转换文件编码格式
2015/05/17 Python
Python中max函数用法实例分析
2015/07/17 Python
python扫描proxy并获取可用代理ip的实例
2017/08/07 Python
Python定义函数实现累计求和操作
2020/05/03 Python
Python Serial串口基本操作(收发数据)
2020/11/06 Python
2020年10款优秀的Python第三方库,看看有你中意的吗?
2021/01/12 Python
HTML5逐步分析实现拖放功能的方法
2020/09/30 HTML / CSS
Oral-B荷兰:牙医最推荐的品牌
2020/02/25 全球购物
行政人员工作职责
2013/12/05 职场文书
档案保密承诺书
2014/06/03 职场文书
2014学习优秀共产党员先进事迹思想汇报
2014/09/14 职场文书
党员评议思想汇报
2014/10/08 职场文书
职代会闭幕词
2015/01/28 职场文书
婚宴父母致辞
2015/07/27 职场文书
Mysql 一主多从的部署
2022/05/20 MySQL