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 this用法小结
Dec 19 Javascript
基于jQuery替换table中的内容并显示进度条的代码
Aug 02 Javascript
autoPlay 基于jquery的图片自动播放效果
Dec 07 Javascript
JavaScript实现点击按钮后变灰避免多次重复提交
Jul 15 Javascript
jquery实现页面常用的返回顶部效果
Mar 04 Javascript
第十章之巨幕页头缩略图与警告框组件
Apr 25 Javascript
JavaScript的Backbone.js框架入门学习指引
May 07 Javascript
Javascript 使用ajax与C#获取文件大小实例详解
Jan 13 Javascript
详解vue填坑之解决部分浏览器不支持pushState方法
Jul 12 Javascript
使用webpack搭建pixi.js开发环境
Feb 12 Javascript
vue路由的配置和页面切换详解
Sep 09 Javascript
使用Ajax实现进度条的绘制
Apr 07 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解析xml方法实例详解
2015/05/12 PHP
PHP实现求连续子数组最大和问题2种解决方法
2017/12/26 PHP
Laravel validate error处理,ajax,json示例
2019/10/25 PHP
firefox浏览器不支持innerText的解决方法
2013/08/07 Javascript
JS中处理时间之setUTCMinutes()方法的使用
2015/06/12 Javascript
原生JS封装Ajax插件(同域、jsonp跨域)
2016/05/03 Javascript
jQuery解决$符号命名冲突
2016/06/18 Javascript
常用的js验证和数据处理总结
2016/08/02 Javascript
js轮盘抽奖实例分析
2020/04/17 Javascript
详解Vue-基本标签和自定义控件
2017/03/24 Javascript
Vue.js render方法使用详解
2017/04/05 Javascript
简单实现jQuery弹幕效果
2017/05/06 jQuery
详解基于node的前端项目编译时内存溢出问题
2017/08/01 Javascript
JS表单传值和URL编码转换
2018/03/03 Javascript
使用JS获取页面上的所有标签
2018/10/18 Javascript
Vue加载json文件的方法简单示例
2019/01/28 Javascript
详解小程序循环require之坑
2019/03/08 Javascript
解决 window.onload 被覆盖的问题方法
2020/01/14 Javascript
python操作MySQL数据库的方法分享
2012/05/29 Python
Python调用C语言开发的共享库方法实例
2015/03/18 Python
Python爬虫代理IP池实现方法
2017/01/05 Python
Python利用flask sqlalchemy实现分页效果
2020/08/02 Python
Python基于回溯法子集树模板解决找零问题示例
2017/09/11 Python
python批量复制图片到另一个文件夹
2018/09/17 Python
Python爬虫学习之翻译小程序
2019/07/30 Python
详解Anconda环境下载python包的教程(图形界面+命令行+pycharm安装)
2019/11/11 Python
python GUI库图形界面开发之PyQt5布局控件QHBoxLayout详细使用方法与实例
2020/03/06 Python
使用darknet框架的imagenet数据分类预训练操作
2020/07/07 Python
巧用 CSS3的webkit-box-reflect 倒影实现各类动效
2021/03/05 HTML / CSS
Linux面试经常问的文件系统操作命令
2016/10/04 面试题
医学检验专业个人求职信范文
2013/12/04 职场文书
高级护理专业毕业生推荐信
2013/12/25 职场文书
销售员岗位职责范本
2014/02/03 职场文书
中餐厅经理岗位职责
2014/04/11 职场文书
带病坚持工作事迹
2014/05/03 职场文书
门卫管理制度范本
2015/08/05 职场文书