jQuery 源码分析3: jQuery.fn/ jQuery.prototype
// 建立方法实例,提高方法访问的速度(避免在原型链上搜索) 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 源码分析3: jQuery.fn/ jQuery.prototype的更多相关文章
- jQuery源码分析系列
声明:本文为原创文章,如需转载,请注明来源并保留原文链接Aaron,谢谢! 版本截止到2013.8.24 jQuery官方发布最新的的2.0.3为准 附上每一章的源码注释分析 :https://git ...
- [转]jQuery源码分析系列
文章转自:jQuery源码分析系列-Aaron 版本截止到2013.8.24 jQuery官方发布最新的的2.0.3为准 附上每一章的源码注释分析 :https://github.com/JsAaro ...
- jQuery源码分析系列(转载来源Aaron.)
声明:非本文原创文章,转载来源原文链接Aaron. 版本截止到2013.8.24 jQuery官方发布最新的的2.0.3为准 附上每一章的源码注释分析 :https://github.com/JsAa ...
- jQuery源码分析系列——来自Aaron
jQuery源码分析系列——来自Aaron 转载地址:http://www.cnblogs.com/aaronjs/p/3279314.html 版本截止到2013.8.24 jQuery官方发布最新 ...
- jQuery 源码分析 8: 回头看jQuery的构造器(jQuery.fn,jQury.prototype,jQuery.fn.init.prototype的分析)
在第一篇jQuery源码分析中,简单分析了jQuery对象的构造过程,里面提到了jQuery.fn.jQuery.prototype.jQuery.fn.init.prototype的关系. 从代码中 ...
- jQuery 源码分析(十七) 事件系统模块 实例方法和便捷方法 详解
实例方法和便捷方法是指jQuery可以直接通过链接操作的方法,是通过调用$.event上的方法(上一节介绍的底层方法)来实现的,常用的如下: on(types,selector,data,fn,one ...
- jQuery 源码分析(十三) 数据操作模块 DOM属性 详解
jQuery的属性操作模块总共有4个部分,本篇说一下第2个部分:DOM属性部分,用于修改DOM元素的属性的(属性和特性是不一样的,一般将property翻译为属性,attribute翻译为特性) DO ...
- [转] jQuery源码分析-如何做jQuery源码分析
jQuery源码分析系列(持续更新) jQuery的源码有些晦涩难懂,本文分享一些我看源码的方法,每一个模块我基本按照这样的顺序去学习. 当我读到难度的书或者源码时,会和<如何阅读一本书> ...
- jquery源码分析之一前言篇
1.问:jquery源码分析的版本是什么? 答:v3.2.1 2.问:为什么要分析jquery源码? 答:javascript是一切js框架的基础,jquery.es6.vue.angular.rea ...
- jQuery源码分析-each函数
本文部分截取自且行且思 jQuery.each方法用于遍历一个数组或对象,并对当前遍历的元素进行处理,在jQuery使用的频率非常大,下面就这个函数做了详细讲解: 复制代码代码 /*! * jQuer ...
随机推荐
- UVa1328 - Period(KMP找最短循环节)
题目大意 给定一个长度为n的字符串,求它的每个前缀的最短循环节 题解 白书例题~~~ "错位部分"长度为i-f[i], 如果这个前i个字符能够组成一个周期串,那么"错位& ...
- Codeforces Round #226 (Div. 2)B. Bear and Strings
/* 题意就是要找到包含“bear”的子串,计算出个数,需要注意的地方就是不要计算重复. */ 1 #include <stdio.h> #include <string.h> ...
- 安装PHP出现make: *** [sapi/cli/php] Error 1 解决办法
ext/iconv/.libs/iconv.o: In function `php_iconv_stream_filter_ctor':/home/king/php-5.2.13/ext/iconv/ ...
- stream转byte数组几种方式
第一种,写法最简单的.使用原生IO,一个字节一个字节读: //一个字符一个字符读,太慢 int i; while((i=in.read()) != -1){ i = in.read(); arr[j+ ...
- Ⅹ.spring的点点滴滴--IObjectPostProcessor(对象后处理器)
承接上文 IObjectPostProcessor(对象后处理器) 前提是实现接口的对象注册给当前容器 C#: 通过继承AbstractObjectFactory对象的AddObjectPostPro ...
- 发布ASP(非.Net)网站
1.安装IIS 2.设置网址.端口 3.设置文档(默认访问的文档,比如index.asp,index.htm等) 4.双击asp - 展开行为 - 启用父路径:true - 允许访问父目录 5.应用程 ...
- Yii2 多域名跨域同步登录退出
在平台开发过程中,项目分为前台(frontend)www.xxx.com和后台(backend) yun.xxx.com两部分,绑定两个域名, 我们知道在没有绑定域名的时候前后台可以同步登录和退出,但 ...
- "用wow64exts调试64位任务管理器抓取的32位程序的dump"
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:"用wow64exts调试64位任务管理器抓取的32位程序的dump".
- PetShop 4.0学习笔记:消息队列MSMQ
直到今天才知道,在我们每天都在用的Window系统里还有这么好用的一个编程组件:消息队列.它能够解决在大数据量交换的情况下的性能问题,特别是BS系统的数据库性能.而且它的异步处理方式能给程序员最大的便 ...
- 征服 Nginx + Tomcat【转】
征服 Nginx + Tomcat Server Architecture/Distributed nginxtomcatsessioncluster 2年前一直折腾Apache,现如今更习惯Ngi ...