jQuery 源码分析3: jQuery.fn/ jQuery.prototype

 1 // 建立方法实例,提高方法访问的速度(避免在原型链上搜索)
 2
 3 var deletedIds = [];
 4 var slice = deletedIds.slice;
 5 var concat = deletedIds.concat;
 6 var push = deletedIds.push;
 7 var indexOf = deletedIds.indexOf;
 8 var class2type = {};
 9 var toString = class2type.toString;
10 var hasOwn = class2type.hasOwnProperty;
11 var support = {};
12
13
14
15 jQuery.fn = jQuery.prototype = {
16      // 保存目前jQuery版本号
17      jquery: version,
18      // 指向构造器
19      constructor: jQuery,
20
21      // 初始化空的选择器
22      selector: "",
23
24      // 初始化长度为0,及空的jQuery对象的length为0,可以此判断是否存在查找结果
25      length: 0,
26      // 转换成Array并返回
27      toArray: function() {
28           return slice.call( this );     // 使用了Array.slice
29      },
30
31      // num == 0 则返回所有元素
32
33      // 如果 num < 0, 则返回第this.length + num个元素
34      get: function( num ) {
35           return num != null ?
36                // 返回一个元素
37                ( num < 0 ? this[ num + this.length ] : this[ num ] ) :
38                // 返回全部元素
39                slice.call( this );
40      },
41
42      // 将一个DOM元素集Array压入到jQuery栈
43
44      // 该方法在find,parent,filter中被频繁使用
45
46      // 通过创建prevObject,能够跟踪链式调用中上一个调用方法返回的元素集
47      pushStack: function( elems ) {
48            // 建立新的jQuery对象以保存新的元素集(将新元素集合并到其中)
49           var ret = jQuery.merge( this.constructor(), elems );
50            // 新jQuery对象中创建prevObject,引用原来的jQuery对象,更新新元素集的上下文
51           ret.prevObject = this;
52           ret.context = this.context;
53            // 返回新的元素集
54           return ret;
55      },
56
57      // 每个元素都调用一次回调函数,参数已Array形式传递(内部调用时才使用)
58      each: function( callback, args ) {
59           return jQuery.each( this, callback, args );
60      },
61       // jQuery.map对this中的每个key重新用回调函数计算出新的值并返回
62
63      // 将jQuery.map的返回结果添加到新的jQuery中并返回,新的jQuery以原有的元素为基础
64      map: function( callback ) {           return this.pushStack( jQuery.map(this, function( elem, i ) {
65                return callback.call( elem, i, elem );
66           }));
67      },
68       // 通过slice将"参数数组"截取并压栈
69      slice: function() {
70           return this.pushStack( slice.apply( this, arguments ) );
71      },
72       // 将第一个元素压栈并返回新的jQuery栈
73      first: function() {
74           return this.eq( 0 );
75      },
76       // 将最后一个元素压栈并返回新的jQuery栈
77      last: function() {
78           return this.eq( -1 );     // 实际上是 len - 1, 即最后一个元素
79      },
80       // 取this[i]并压栈,如果i < 0则取this[len + i],如果i > len, 压入空Array
81      eq: function( i ) {
82           var len = this.length,
83                j = +i + ( i < 0 ? len : 0 );           return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
84      },
85       // prevObject是通过pushStack创建的,通过end跟踪链式调用中上一个方法返回的DOM元素集
86      // end相当与一个出栈操作,通过end,能够返回到上一个链式调用方法的元素集,如
87
88      // $().find(‘button‘).click(function(){alert(1)})     // 对find(‘button‘)返回的元素操作
89
90      //             .end().click(function(){alert(2)})     // 返回到find(‘button‘)返回的元素,然后操作
91
92      end: function() {
93           return this.prevObject || this.constructor(null);
94      },
95       // 内部调用, 引用Array方法
96      push: push,
97      sort: deletedIds.sort,
98      splice: deletedIds.splice
99 };

这里定义了一个重要的方法————jQuery.pushStack;它在find,filter,parent等方法中被频繁使用。通过创建prevObject记录上次链式调用时返回的元素集结果,以此能够实现对链式调用元素集的跟踪,利用jQuery.end来回溯到上一次调用的结果。

时间: 2024-10-26 18:47:08

jQuery 源码分析3: jQuery.fn/ jQuery.prototype的相关文章

jQuery源码分析(一)jQuery.support

1 // Internet Explorer 8.0.7601.17514 | Chrome 34.0.1847.131 m | Firefox 30.0 2 (function () { 3 4 jQuery.support = {}; 5 6 var root = document.documentElement, 7 script = document.createElement("script"), 8 div = document.createElement("di

[转]jQuery源码分析系列

文章转自:jQuery源码分析系列-Aaron 版本截止到2013.8.24 jQuery官方发布最新的的2.0.3为准 附上每一章的源码注释分析 :https://github.com/JsAaron/jQuery 正在编写的书 - jQuery架构设计与实现 本人在慕课网的教程(完结) jQuery源码解析(架构与依赖模块) 64课时 jQuery源码解析(DOM与核心模块)64课时 jQuery源码分析目录(完结) jQuery源码分析系列(01) : 整体架构 jQuery源码分析系列(

Jquery源码分析

1.概述 jQuery是一个非常优秀的Js库,与prototype,YUI,Mootools等众多的Js类库相比,它剑走偏锋,从web开发最实用的角度出发,抛除了一些中看但不实用的东西,为开发者提供一个短小精悍的类库.由于其个短小精悍,使用简单方便,性能相对高效.众多的开发者都选择Jquery来进行辅助的web开发. 在使用jquery时开发,我们也会时常碰到许多的问题,但是jquery的代码很晦涩,难起看懂,当开发时出现了问题,看不懂源码,不知道如何去排错. John Resig,Jquery

jquery源码分析(二)——结构

再来复习下整体架构: jQuery源码分析(基于 jQuery 1.11 版本,共计8829行源码) (21,94)                定义了一些变量和函数jQuery=function(){} (96,280)        给jQuery添加一些方法和属性,jQuery.fn=jQuery.prototype(285,347)        extend:        jQuery的一些继承方法        更容易进行后续的扩展                       

jQuery源码分析系列(38) : 队列操作

Queue队列,如同data数据缓存与Deferred异步模型一样,都是jQuery库的内部实现的基础设施 Queue队列是animate动画依赖的基础设施,整个jQuery中队列仅供给动画使用 Queue队列 队列是一种特殊的线性表,只允许在表的前端(队头)进行删除操作(出队),在表的后端(队尾)进行插入操作(入队).队列的特点是先进先出(FIFO-first in first out),即最先插入的元素最先被删除. 为什么要引入队列? 我们知道代码的执行流有异步与同步之分,例如 var a

jQuery源码分析:源码结构与核心函数

jQuery源码分析-03构造jQuery对象-源码结构和核心函数 jQuery.fn和jQuery.prototype区别

jQuery源码分析1

写在开头: 昨天开始,我决定要认真的看看jQuery的源码,选择1.7.2,源于公司用的这个版本.由于源码比较长,这将会是一个比较持久的过程,我将要利用业余时间,和偶尔上班不算忙的时间来进行.其实原本是打算对着源码抄一遍,将对其的理解写成注释,这也算是在强行堆代码量了吧(我想我这是有多懒,必须要反省).不过鉴于自己平时比较懒惰的可耻行径,和太多的东西都写在一起有点庞大,我想我还是有必要写成一个专栏,来记录这个过程.其实最根本的原因是:源码里都是有注释的,而且注释写得那么详尽,翻译过来就是了,但是

jQuery源码分析系列(39) : 动画队列

data函数在jQuery中只有短短的300行代码,非常不起点 ,剖析源码的时候你会发现jQuery只要在有需要保存数据的地方无时无刻不依赖这个基础设施 动画会调用队列,队列会调用data数据接口还保存队列里面的的动画数据 所以我们在自习回顾下关于数据缓存 //These may be used throughout the jQuery core codebase //存数据的 //用户使用 data_user = new Data(); //存储对象 //jQuery内部私有 //用来存事件

jQuery源码分析系列(37) : Ajax 总结

综合前面的分析,我们总结如下3大块: jQuery1.5以后,AJAX模块提供了三个新的方法用于管理.扩展AJAX请求 前置过滤器 jQuery. ajaxPrefilter 请求分发器 jQuery. ajaxTransport 类型转换器 ajaxConvert 为了整体性与扩展性考虑,把整个结构通过Deferred实现异步链式模型,Promise对象可以轻易的绑定成功.失败.进行中三种状态的回调函数,然后通过在状态码在来回调不同的函数就行了 出于同源策略考虑,存在跨域问题,所以ajax内部

jQuery 源码分析(十三) 数据操作模块 DOM属性 详解

jQuery的属性操作模块总共有4个部分,本篇说一下第2个部分:DOM属性部分,用于修改DOM元素的属性的(属性和特性是不一样的,一般将property翻译为属性,attribute翻译为特性) DOM属性的静态方法接口如下: prop(elem, name, value)    ;设置或读取DOM属性,有两种用法,如下 ·$.prop(elem,name,value)      ;传入第三个参数表示设置elem元素的name属性值为value ·$.prop(elem,name,)