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 相关文章推荐
清空上传控件input file的值
Jul 03 Javascript
JavaScript动态修改背景颜色的方法
Apr 16 Javascript
JavaScript sort数组排序方法和自我实现排序方法小结
Jun 06 Javascript
jQuery之动画效果大全
Nov 09 Javascript
jQuery插件FusionCharts实现的MSBar3D图效果示例【附demo源码】
Mar 23 jQuery
Vue如何实现组件的源码解析
Jun 08 Javascript
Easyui在treegrid添加控件的实现方法
Jun 23 Javascript
vue input 输入校验字母数字组合且长度小于30的实现代码
May 16 Javascript
详解vue中localStorage的使用方法
Nov 22 Javascript
vue 实现模糊检索并根据其他字符的首字母顺序排列
Sep 19 Javascript
Vue-router 报错NavigationDuplicated的解决方法
Mar 31 Javascript
深入理解Vue的数据响应式
May 15 Vue.js
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中文乱码
2009/11/26 PHP
PHP 提取图片img标记中的任意属性的简单实例
2013/12/10 PHP
php json中文编码为null的解决办法
2016/12/14 PHP
PHP面向对象类型约束用法分析
2019/06/12 PHP
javascript attachEvent和addEventListener使用方法
2009/03/19 Javascript
js onpropertychange输入框 事件获取属性
2009/03/26 Javascript
用apply让javascript函数仅执行一次的代码
2010/06/27 Javascript
jquery div 居中技巧应用介绍
2012/11/24 Javascript
Jquery实现搜索框提示功能示例代码
2013/08/13 Javascript
jQuery中remove()方法用法实例
2014/12/25 Javascript
jQuery实现彩带延伸效果的网页加载条loading动画
2015/10/29 Javascript
jQuery Validation Plugin验证插件手动验证
2016/01/26 Javascript
BootStrap Tooltip插件源码解析
2016/12/27 Javascript
Html5 js实现手风琴效果
2020/04/17 Javascript
Bootstrap下拉菜单样式
2017/02/07 Javascript
Angular2学习笔记之数据绑定的示例代码
2018/01/03 Javascript
vue+php实现的微博留言功能示例
2019/03/16 Javascript
八种Vue组件间通讯方式合集(推荐)
2020/08/18 Javascript
JavaScript 如何在浏览器中使用摄像头
2020/12/02 Javascript
Python实现树莓派WiFi断线自动重连的实例代码
2017/03/16 Python
Python实现读取邮箱中的邮件功能示例【含文本及附件】
2017/08/05 Python
Python告诉你木马程序的键盘记录原理
2019/02/02 Python
利用Python查看微信共同好友功能的实现代码
2019/04/24 Python
python yield和Generator函数用法详解
2020/02/10 Python
Python unittest基本使用方法代码实例
2020/06/29 Python
python 使用paramiko模块进行封装,远程操作linux主机的示例代码
2020/12/03 Python
selenium携带cookies模拟登陆CSDN的实现
2021/01/19 Python
CSS3实战第一波 让我们尽情的圆角吧
2010/08/27 HTML / CSS
5个你不知道的HTML5的接口介绍
2013/08/07 HTML / CSS
TUMI马来西亚官方网站:国际领先的高品质商旅箱包品牌
2018/04/26 全球购物
安全的后院和健身蹦床:JumpSport
2019/07/15 全球购物
建筑设计专业求职自我评价
2014/03/02 职场文书
元旦联欢会主持词
2014/03/26 职场文书
2014年合同管理工作总结
2014/12/02 职场文书
Java 死锁解决方案
2022/05/11 Java/Android
Oracle查看表空间使用率以及爆满解决方案详解
2022/07/23 Oracle