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应该怎样学
Apr 16 Javascript
单击浏览器右上角的X关闭窗口弹出提示的小例子
Jun 12 Javascript
js css后面所带参数含义介绍
Aug 18 Javascript
防止登录页面出现在frame中js代码
Jul 22 Javascript
全面解析Bootstrap中tooltip、popover的使用方法
Jun 13 Javascript
AngularJS中$http使用的简单介绍
Mar 17 Javascript
Vue中img的src属性绑定与static文件夹实例
May 18 Javascript
浅谈Angular2 模块懒加载的方法
Oct 04 Javascript
Vue 路由切换时页面内容没有重新加载的解决方法
Sep 01 Javascript
详解vue-cli+es6引入es5写的js(两种方法)
Apr 19 Javascript
解决Vue @submit 提交后不刷新页面问题
Jul 18 Javascript
js删除指定位置超链接中含有百度与360的标题
Jan 06 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
20个2014年最优秀的PHP框架回顾
2014/10/22 PHP
PHP用PDO如何封装简单易用的DB类详解
2017/07/30 PHP
[原创]用javascript实现检测指定目录是否存在的方法
2008/01/12 Javascript
JavaScript 版本自动生成文章摘要
2008/07/23 Javascript
基于jQuery制作迷你背词汇工具
2010/07/27 Javascript
javascript中用星号表示预录入内容的实现代码
2011/01/08 Javascript
JavaScript搜索字符串并将搜索结果返回到字符串的方法
2015/04/06 Javascript
JQuery实现图片轮播效果
2015/09/15 Javascript
js文字横向滚动特效
2015/11/11 Javascript
jQuery实现的左右移动焦点图效果
2016/01/14 Javascript
jQuery对象与DOM对象转换方法详解
2016/05/10 Javascript
AngularJS 入门教程之HTML DOM实例详解
2016/07/28 Javascript
jQuery布局组件EasyUI Layout使用方法详解
2017/02/28 Javascript
vue3.0 CLI - 2.3 - 组件 home.vue 中学习指令和绑定
2018/09/14 Javascript
vue踩坑记-在项目中安装依赖模块npm install报错
2019/04/02 Javascript
详解Vue+ElementUI从零开始搭建自己的网站(一、环境搭建)
2019/04/30 Javascript
jquery实现动态改变css样式的方法分析
2019/05/27 jQuery
Vue 样式切换及三元判断样式关联操作
2020/08/09 Javascript
[06:04]DOTA2国际邀请赛纪录片:Just For LGD
2013/08/11 DOTA
Python获取当前时间的方法
2014/01/14 Python
基于python实现在excel中读取与生成随机数写入excel中
2018/01/04 Python
Python中的并发处理之asyncio包使用的详解
2018/04/03 Python
Python二维码生成识别实例详解
2019/07/16 Python
python验证码图片处理(二值化)
2019/11/01 Python
Python Tornado批量上传图片并显示功能
2020/03/26 Python
python使用建议与技巧分享(二)
2020/08/17 Python
Python页面加载的等待方式总结
2021/02/28 Python
JACK & JONES英国官方网站:欧洲领先的男装生产商
2017/09/27 全球购物
市场营销专业个人自荐信格式
2013/09/21 职场文书
2014学雷锋活动心得体会
2014/03/10 职场文书
竞选村长演讲稿
2014/04/28 职场文书
庆国庆国旗下讲话稿2014
2014/09/21 职场文书
党员评议个人总结
2014/10/20 职场文书
2019财务管理制度最新范本!
2019/07/09 职场文书
HR必备:销售经理聘用合同范本
2019/08/21 职场文书
人物搭配车车超萌联名预备中 【咒术迴战】 ⨯ 【天竺鼠车车】 展开合作
2022/04/11 日漫