// 建立方法实例,提高方法访问的速度(避免在原型链上搜索)

 var deletedIds = [];
var slice = deletedIds.slice;
var concat = deletedIds.concat;
var push = deletedIds.push;
var indexOf = deletedIds.indexOf;
var class2type = {};
var toString = class2type.toString;
var hasOwn = class2type.hasOwnProperty;
var support = {}; jQuery.fn = jQuery.prototype = {
// 保存目前jQuery版本号
jquery: version,
// 指向构造器
constructor: jQuery, // 初始化空的选择器
selector: "", // 初始化长度为0,及空的jQuery对象的length为0,可以此判断是否存在查找结果
length: 0,
// 转换成Array并返回
toArray: function() {
return slice.call( this ); // 使用了Array.slice
}, // num == 0 则返回所有元素 // 如果 num < 0, 则返回第this.length + num个元素
get: function( num ) {
return num != null ?
// 返回一个元素
( num < 0 ? this[ num + this.length ] : this[ num ] ) :
// 返回全部元素
slice.call( this );
}, // 将一个DOM元素集Array压入到jQuery栈 // 该方法在find,parent,filter中被频繁使用 // 通过创建prevObject,能够跟踪链式调用中上一个调用方法返回的元素集
pushStack: function( elems ) {
// 建立新的jQuery对象以保存新的元素集(将新元素集合并到其中)
var ret = jQuery.merge( this.constructor(), elems );
// 新jQuery对象中创建prevObject,引用原来的jQuery对象,更新新元素集的上下文
ret.prevObject = this;
ret.context = this.context;
// 返回新的元素集
return ret;
}, // 每个元素都调用一次回调函数,参数已Array形式传递(内部调用时才使用)
each: function( callback, args ) {
return jQuery.each( this, callback, args );
},
// jQuery.map对this中的每个key重新用回调函数计算出新的值并返回 // 将jQuery.map的返回结果添加到新的jQuery中并返回,新的jQuery以原有的元素为基础
map: function( callback ) { return this.pushStack( jQuery.map(this, function( elem, i ) {
return callback.call( elem, i, elem );
}));
},
// 通过slice将"参数数组"截取并压栈
slice: function() {
return this.pushStack( slice.apply( this, arguments ) );
},
// 将第一个元素压栈并返回新的jQuery栈
first: function() {
return this.eq( 0 );
},
// 将最后一个元素压栈并返回新的jQuery栈
last: function() {
return this.eq( -1 ); // 实际上是 len - 1, 即最后一个元素
},
// 取this[i]并压栈,如果i < 0则取this[len + i],如果i > len, 压入空Array
eq: function( i ) {
var len = this.length,
j = +i + ( i < 0 ? len : 0 ); return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
},
// prevObject是通过pushStack创建的,通过end跟踪链式调用中上一个方法返回的DOM元素集
// end相当与一个出栈操作,通过end,能够返回到上一个链式调用方法的元素集,如 // $().find('button').click(function(){alert(1)}) // 对find('button')返回的元素操作 // .end().click(function(){alert(2)}) // 返回到find('button')返回的元素,然后操作 end: function() {
return this.prevObject || this.constructor(null);
},
// 内部调用, 引用Array方法
push: push,
sort: deletedIds.sort,
splice: deletedIds.splice
};
 
这里定义了一个重要的方法————jQuery.pushStack;它在find,filter,parent等方法中被频繁使用。通过创建prevObject记录上次链式调用时返回的元素集结果,以此能够实现对链式调用元素集的跟踪,利用jQuery.end来回溯到上一次调用的结果。
 

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

  1. jQuery源码分析系列

    声明:本文为原创文章,如需转载,请注明来源并保留原文链接Aaron,谢谢! 版本截止到2013.8.24 jQuery官方发布最新的的2.0.3为准 附上每一章的源码注释分析 :https://git ...

  2. [转]jQuery源码分析系列

    文章转自:jQuery源码分析系列-Aaron 版本截止到2013.8.24 jQuery官方发布最新的的2.0.3为准 附上每一章的源码注释分析 :https://github.com/JsAaro ...

  3. jQuery源码分析系列(转载来源Aaron.)

    声明:非本文原创文章,转载来源原文链接Aaron. 版本截止到2013.8.24 jQuery官方发布最新的的2.0.3为准 附上每一章的源码注释分析 :https://github.com/JsAa ...

  4. jQuery源码分析系列——来自Aaron

    jQuery源码分析系列——来自Aaron 转载地址:http://www.cnblogs.com/aaronjs/p/3279314.html 版本截止到2013.8.24 jQuery官方发布最新 ...

  5. jQuery 源码分析 8: 回头看jQuery的构造器(jQuery.fn,jQury.prototype,jQuery.fn.init.prototype的分析)

    在第一篇jQuery源码分析中,简单分析了jQuery对象的构造过程,里面提到了jQuery.fn.jQuery.prototype.jQuery.fn.init.prototype的关系. 从代码中 ...

  6. jQuery 源码分析(十七) 事件系统模块 实例方法和便捷方法 详解

    实例方法和便捷方法是指jQuery可以直接通过链接操作的方法,是通过调用$.event上的方法(上一节介绍的底层方法)来实现的,常用的如下: on(types,selector,data,fn,one ...

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

    jQuery的属性操作模块总共有4个部分,本篇说一下第2个部分:DOM属性部分,用于修改DOM元素的属性的(属性和特性是不一样的,一般将property翻译为属性,attribute翻译为特性) DO ...

  8. [转] jQuery源码分析-如何做jQuery源码分析

    jQuery源码分析系列(持续更新) jQuery的源码有些晦涩难懂,本文分享一些我看源码的方法,每一个模块我基本按照这样的顺序去学习. 当我读到难度的书或者源码时,会和<如何阅读一本书> ...

  9. jquery源码分析之一前言篇

    1.问:jquery源码分析的版本是什么? 答:v3.2.1 2.问:为什么要分析jquery源码? 答:javascript是一切js框架的基础,jquery.es6.vue.angular.rea ...

  10. jQuery源码分析-each函数

    本文部分截取自且行且思 jQuery.each方法用于遍历一个数组或对象,并对当前遍历的元素进行处理,在jQuery使用的频率非常大,下面就这个函数做了详细讲解: 复制代码代码 /*! * jQuer ...

随机推荐

  1. SQLite 在Windows Server 2008 R2 部署问题FAQ汇总[轉]

    轉自:http://www.steveluo.name/sqlite-windows-server-2008-r2-deploy-faq/ 今天花了一天的时间研究了一下SQLite,以取代一些轻量级项 ...

  2. ADODB.Connection 错误 '800a0e7a' 未找到提供程序 该程序可能未正确安装

    今天调程序的时候发现的,错误提示如下: ADODB.Connection 错误 '800a0e7a' 未找到提供程序.该程序可能未正确安装. /conn.asp,行 6 因为系统是64位的win7或w ...

  3. php中的$_SERVER从哪来

    前几个月学了个tcpdump抓包命令,遇到任何问题总想试试,真是程序员的终级武器呀,它像显微镜一下,把任何的丑陋的bug都显示在你的面前. 为什么有题目中所说的疑问呢?因为我发现在不同的环境下面,我获 ...

  4. redis缓存技术

    初学redis缓存技术,如果文章写得不好还请谅解 应用环境:win7 实现环境:cmd,eclipse redis缓存技术的特点就在于高效,因为目前涉及的数据量逐渐增多,在对于数据的存储上面和sql以 ...

  5. 超详细单机版搭建hadoop环境图文解析

    前言: 年前,在老大的号召下,我们纠集了一帮人搞起了hadoop,并为其取了个响亮的口号“云在手,跟我走”.大家几乎从零开始,中途不知遇到多少问题,但终 于在回家之前搭起了一个拥有12台服务器的集群, ...

  6. SQL Server将一列的多行内容拼接成一行的问题讨论

    转自http://blog.csdn.net/rolamao/article/details/7745972 昨天遇到一个SQL Server的问题:需要写一个储存过程来处理几个表中的数据,最后问题出 ...

  7. DDD的好文章

    http://www.jdon.com/44815   //cqrs 架构 http://www.jdon.com/tags/272 解道领域驱动专题

  8. ThinkPad New X1 Carbon中关闭任务栏上的触摸键盘

    1. 执行services.msc 2. 选择Touch Keyboard and Handwriting Panel 服务. 3. 将其停止执行. 并disable.

  9. 在Java项目中整合Scala

    Scala是一个运行在Java JVM上的面向对象的语言.它支持函数编程,在语法上比Java更加灵活,同时通过Akka库,Scala支持强大的基于Actor的多线程编程.具有这些优势,使得我最近很想在 ...

  10. java 拦截器和过滤器区别(转载)

    1.拦截器是基于java的反射机制的,而过滤器是基于函数回调 2.过滤器依赖与servlet容器,而拦截器不依赖与servlet容器 3.拦截器只能对action请求起作用,而过滤器则可以对几乎所有的 ...