jQuery内部原理和实现方式浅析

 更新时间:2015年02月03日 09:40:53   作者:Hito''s Blog  
这篇文章主要介绍了jQuery内部原理和实现方式浅析,本文试图从整体来阐述一下jQuery的内部实现,需要的朋友可以参考下

这段时间在学习研究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的实现可能是类似这样的:

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.prototype均有各自的属性和方法,两者的调用方法各不一样,这两个对象都有一个extend方法,都是用来扩展自身的属性和方法,在jQuery内部,extend的实现实际是靠一样的代码, 将在后面的源码分析中做以详细的分析。

相关文章

  • 从零开始学习jQuery (九) jQuery工具函数

    从零开始学习jQuery (九) jQuery工具函数

    我们经常要使用脚本处理各种业务逻辑, 最常见的就是数组和对象的操作. jQuery工具函数为我们操作对象和数组提供了便利条件.
    2011-02-02
  • jQuery 选择符详细介绍及整理

    jQuery 选择符详细介绍及整理

    这篇文章主要介绍了jQuery 选择符详细介绍及整理的相关资料,这里整理了选择符的一些资料,帮助到家学习这部分内容,需要的朋友可以参考下
    2016-12-12
  • Jquery实现异步上传文件

    Jquery实现异步上传文件

    这篇文章主要为大家详细介绍了Jquery实现异步上传文件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • jquery输入数字随机抽奖特效的简单实现代码

    jquery输入数字随机抽奖特效的简单实现代码

    下面小编就为大家带来一篇jquery输入数字随机抽奖特效的简单实现代码。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • JQuery实现超链接鼠标提示效果的方法

    JQuery实现超链接鼠标提示效果的方法

    这篇文章主要介绍了JQuery实现超链接鼠标提示效果的方法,涉及jQuery针对鼠标事件及页面元素样式操作的相关技巧,需要的朋友可以参考下
    2015-06-06
  • 一篇文章带你入门和了解Jquery的基础操作

    一篇文章带你入门和了解Jquery的基础操作

    这篇文章主要讲述了一个JQuery入门基础,实现的过程效果都很简单,特别适合初学者来学习,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • jQuery中after()方法用法实例

    jQuery中after()方法用法实例

    这篇文章主要介绍了jQuery中after()方法用法,以实例形式较为详细的分析了after()方法的功能、特性与使用技巧,具有一定的参考借鉴价值,需要的朋友可以参考下
    2014-12-12
  • jQuery UI Dialog控件中的表单无法正常提交的解决方法

    jQuery UI Dialog控件中的表单无法正常提交的解决方法

    研究了页面源码后发现,jQuery UI Dialog控件初始化时动态生成的HTML元素被添加到页面的尾部、form元素的后面,而原始的Dialog模板部分(其内包含表单元素)也被移到了 动态生成的HTML元素内。
    2010-12-12
  • 使用jQuery实现Web页面换肤功能的要点解析

    使用jQuery实现Web页面换肤功能的要点解析

    网页换肤的实质就是切换CSS样式,关键是给用户做出点击切换的功能以及换肤完成之后的缓存记录功能,下面我们就来看一下使用jQuery实现Web页面换肤功能的要点解析:
    2016-05-05
  • jquery多级树形下拉菜单的实例代码

    jquery多级树形下拉菜单的实例代码

    这篇文章主要介绍了jquery多级树形下拉菜单的实例代码,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2019-07-07

最新评论