jquery源码解析:代码结构分析
本系列是针对jquery2.0.3版本进行的讲解。此版本不支持IE8及以下版本。
(function(){
(21, 94) 定义了一些变量和函数, jQuery = function(){};
(96,283) 给jQuery对象添加一些属性和方法(实例方法,通过$("div")这类的jQuery实例对象来调用)
(285,347) extend : jQuery的继承方法
(349,817) jQuery.extend():扩展一些工具方法(静态方法,直接通过$来调用的,比如:$.trim)
(877,2856) Sizzle:复杂选择器的实现。比如:$("ul li + p ");
(2880,3042) Callbacks:回调对象-》函数的统一管理。
(3043,3183) Deferred:延迟对象-》对异步的统一管理
(3184,3295) support:功能检测
(3308,3652) data(): 数据缓存
(3653,3797) queue():队列管理,dequeue.
(3803,4299) attr(),prop(),val(),addClass(),对元素属性的操作
(4300,5128) on(),trigger() 事件操作的相关方法
(5140,6057) DOM操作:添加,删除,获取(next),包装(wrap),Dom筛选
(6058,6620) css():样式的操作
(6621,7854) 提交的数据和ajax的操作:load,ajax
(7855,8584) animate():运动的操作。 show,hide,fadeIn。
(8585,8792) offset(),位置和尺寸的一些方法
(8804,8821) jQuery支持模块化的模式
(8826) window.jQuery = window.$ = jQuery;
})()
(function(window,undefined){
//window局部化,1.查找速度快。2.利于代码压缩,可以把window压缩成a。
//undefined,有些浏览器的undefined可以被修改,为了防止undefined被修改,所以传了一个undefined给了jQuery
core_strundefined = typeof undefined;
//为了防止ie9以及以下版本,判定一个xmlNode方法为undefined时出问题。
//比如:a.b== undefined(a为xmlNode,并且在IE9以下浏览器下,b不存在a中,出问题); typeof a.b== "undefined"(没问题)
class2type = {};
//类型判断,里面存的是{"[object String]":"string",....}。先去了解object.prototype.toString.call()
core_version = "2.0.3";
core_concat = [].concat; //缓存数组方法以及对象方法。利于压缩。可以对core_concat压缩。
......
var rootjQuery,
_jQuery = window.jQuery, //以防在引入jQuery库时,已经有其他库引用jQuery和$标示符了。
_$ = window.$, //因此先把他们保存起来。(prototype.js就引用了$标识)
jQuery = function(selector, context){
return new jQuery.fn.init(selector,context,rootjQuery);
}
......
window.jQuery = window.$ = jQuery;
})(window)
这里我要详细的讲下new jQuery.fn.init(selector,context,rootjQuery);我看了太多别人写的jQuery源码解析,大多写的不详细,导致刚开始看的时候,没看懂。
我们平常新建一个jQuery对象:$("div"),jQuery("div"),调用的就是new jQuery.fn.init(selector,context,rootjQuery);
很多人会有疑问,怎么new一个init,就是jQuery对象。除非init.prototype 就是jQuery.prototype。
大家可以在283行看到这样一句话:jQuery.fn.init.prototype = jQuery.fn;96行看到这样一句话:jQuery.fn = jQuery.prototype = {}
印证了上面的观点。jQuery.fn.init.prototype 就是jQuery.prototype。
当你们去看init方法的时候,会发现它返回的是this,this指的就是new出来的jQuery对象,而大家都知道,当访问一个实例对象的方法和属性时,如果实例对象没有,那么就去找原型对象,因此jQuery.prototype对象中的属性和方法,都可以通过new 出来的jQuery实例对象访问。也就是$("div")这种jQuery的实例对象可以调用各种在jQuery.prototype对象中的属性和方法。
而对于这种静态属性和方法,$.trim,jQuery.trim,是在构造函数的属性上定义的,跟实例对象没有什么关系。举个例子:function Person(){},Person.prototype={};
new Person()就是实例对象,它可以调用Person.prototype中的所有属性和方法。而Person.trim = function(){},就是静态方法,只能通过构造函数Person.trim才能进行调用。
有一个知识点,-webkit-margin-left ->js访问时,会转化成webkitMarginLeft,而-ms-margin-left会转换成MsMarginLeft。
加油!
jquery源码解析:代码结构分析的更多相关文章
- JQuery源码解析(一)
写在前面:本<JQuery源码解析>系列是基于一些前辈们的文章进行进一步的分析.细化.修改而写出来的,在这边感谢那些慷慨提供科普文档的技术大拿们. 要查阅JQ的源文件请下载开发版的JQ.j ...
- jQuery 源码解析二:jQuery.fn.extend=jQuery.extend 方法探究
终于动笔开始 jQuery 源码解析第二篇,写文章还真是有难度,要把自已懂的表述清楚,要让别人听懂真的不是一见易事. 在 jQuery 源码解析一:jQuery 类库整体架构设计解析 一文,大致描述了 ...
- jquery 源码解析
静态与实力方法共享设计 遍历方法 $(".a").each() //作为实例方法存在 $.each() //作为静态方法存在 Jquery源码 jQuery.prototype = ...
- 三.jQuery源码解析之jQuery的框架图
这张图片是对jQuery源码截图,一点一点拼出来的. 现在根据这张图片来对jQuery框架做一些说明. 一.16~9404行可以发现,最外层是一个自调用函数.当jQuery初始化时,这个自调用函数包含 ...
- jquery源码解析:addClass,toggleClass,hasClass详解
这一课,我们将继续讲解jQuery对元素属性操作的方法. 首先,我们先看一下这几个方法是如何使用的: $("#div1").addClass("box1 box2&quo ...
- jquery源码解析:jQuery数据缓存机制详解2
上一课主要讲了jQuery中的缓存机制Data构造方法的源码解析,这一课主要讲jQuery是如何利用Data对象实现有关缓存机制的静态方法和实例方法的.我们接下来,来看这几个静态方法和实例方法的源码解 ...
- jquery源码解析:jQuery数据缓存机制详解1
jQuery中有三种添加数据的方法,$().attr(),$().prop(),$().data().但是前面两种是用来在元素上添加属性值的,只适合少量的数据,比如:title,class,name等 ...
- jquery源码解析:jQuery工具方法when详解
我们先来看when方法是如何使用的: var cb = $.when(); //when方法也是返回一个延迟对象,源码是return deferred.promise();返回的延迟对象不能修改状 ...
- jquery源码解析:jQuery工具方法Callbacks详解
我们首先来讲下Callbacks是如何使用的:第一个例子 function a(){} function b(){} var cb = $.Callbacks(); cb.add(a); cb.add ...
随机推荐
- C#使用NPOI导出excel设置单元格背景颜色
ICellStyle cellStyle = workbook.CreateCellStyle(); cellStyle.FillPattern = FillPattern.SolidForegrou ...
- react native android 真机调试
http://localhost:8081/index.android.bundle?platform=android 晕死,设备掉线了 C:\Users\ZHONGZHENHUA\.android\ ...
- flume 转
http://blog.csdn.net/xiao_jun_0820/article/details/38111305
- 使用CocoaPods卡在了"pod setup"界面的解决办法
http://blog.csdn.net/samoy/article/details/51956799 有时候,我们在执行pod install或pod search命令时,会在终端偶现卡在’ ...
- 关于java是值传递还是引用传递
一.概念 实际上对这两种传递方式,知乎上有个回答说得很好: 值传递和引用传递,属于函数调用时参数的求值策略(Evaluation Strategy),这是对调用函数时,求值和传值的方式的描述,而非传递 ...
- JAVA数据结构实现原理
HashTable 线程安全, 内部函数被synchronized修饰,对象级的锁 HashMap 非线程安全, 需要tradeoff 空间和查找时间, 空间利用率低时,冲突少,查询效率高,反之空间利 ...
- C#中读写配置参数文件(利用Windows的API)
读配置文件与写配置文件的核心代码如下: [DllImport("kernel32")] // 读配置文件方法的6个参数:所在的分区(section).键值. 初始缺省值. ...
- 浅谈 js中parseInt函数的解析[转]
首先还是从很热门的实例parseInt("09")==0说起. parseInt(number,type)这个函数后面如果不跟第2个参数来表示进制的话,默认是10进制. 比如说pa ...
- [C++] const object
const object const 对象只能调用const函数 const函数不能改变一般成员变量的值,但是mutable的变量不受限制
- zigbee组播通信原理
组播: 在zigbee网络里面,把网络节点标记为组的方式来进行通信:发送模块如果发送的组号和网络里标记模块的组号相对应,那么这些模块就可以拿到这些无线数据包. 特点: 1.分组中组的编号有两个字节. ...