将类数组对象转化为数组对象

javascript中有许多类数组对象,比如HTMLCollection,NodeList,arguments。她们的特点是和数组一样有length属性,并且有0,1,2这样的位置属性。在代码编写中我们经常需要将他们转化为数组对象。

  1. //mini类数组对象
  2. var arrayLike = {
  3. 0: "a",
  4. 1: "b",
  5. 2: "c",
  6. length: 3
  7. }
  8. console.log(Array.prototype.slice.call(arrayLike))

我们来详细分析一下Array.prototype.slice.call(arrayLike)。数组的中有slice方法,存放在数组的原型中也就是Array.prototype.slice,它操作的返回值是一个数组;call具有修改上下文的作用,本例就是将slice的上下文改为arrayLike。所以这句话就实现了将类数组对象转化为数组对象的功能。

.get()实现

  1. var jQuery = function( selector, context ) {
  2. return new jQuery.fn.init( selector, context );
  3. };
  4. jQuery.fn = jQuery.prototype = {
  5. init: function(selector){
  6. this.selector = selector;
  7. //从IE8之后提供了querySelectorAll,我们先利用它mini化选择器
  8. //返回的是伪数组对象NodeList
  9. var result = document.querySelectorAll(selector);
  10. //将NodeList转化为jQuery对象。
  11. for(var i = 0;i < result.length;i++){
  12. this[i] = result[i]
  13. }
  14. //模拟jQuery对象的length属性
  15. this.length = result.length;
  16. }
  17. }
  18. jQuery.fn.init.prototype = jQuery.fn
  19. //不利用extend ,直接向原型里添加属性方法get
  20. jQuery.fn.get = function(index) {
  21. return index != null ? (index < 0 ? this[this.length + index]:this[index]):Array.prototype.slice.call(this);
  22. }
  23. //测试
  24. console.log(jQuery("div").get(0))

.get的作用是转化为DOM节点,或者是DOM节点数组。注意一些特别的情况。

.eq()实现

  1. var jQuery = function( selector, context ) {
  2. return new jQuery.fn.init( selector, context );
  3. };
  4. jQuery.fn = jQuery.prototype = {
  5. selector: "",
  6. init: function(selector){
  7. //仍然是mini的选择器。
  8. var result = document.querySelectorAll(selector);
  9. for(var i = 0;i < result.length;i++){
  10. this[i] = result[i]
  11. }
  12. this.length = result.length;
  13. },
  14. pushStack: function( elems ) {
  15. //将空jQuery对象和elems合并
  16. var ret = jQuery.merge( this.constructor(), elems );
  17. //设置前一个对象,作回来的索引。
  18. ret.prevObject = this;
  19.  
  20. // 新形成jQuery的对象
  21. return ret;
  22. },
  23. eq : function( i ) {
  24. //将负数位置转化为正数位置
  25. var j = + i + ( i < 0 ? this.length:0);
  26. //在范围内返回指定对象包成的数组,否则返回空数组
  27. return this.pushStack((j >= 0&& j<this.length)?[this[j]]:[])
  28. },
  29. //将原型的构造函数设置为jQuery,可以用jQuery.constructor创造新的空对象;相关语句this.constructor;jQuery.prototype;
  30. constructor : jQuery
  31. }
  32. jQuery.fn.init.prototype = jQuery.fn
  33. //将两个类数组对象或数组对象合并,并设置,length
  34. jQuery.merge = function( first, second ) {
  35. var len = +second.length,
  36. j = 0,
  37. i = first.length;
  38. for ( ; j < len; j++ ) {
  39. first[ i++ ] = second[ j ];
  40. }
  41.  
  42. first.length = i;
  43.  
  44. return first;
  45. };
  46. //测试
  47. console.log(jQuery("div").eq(0))

先讲两个相关函数jQuery.fn.pushStatic和jQuery.merge。

写在jQuery.fn里的函数实际写在原型里,用到这个原型的构造函数都会继承;而写在jQuery里的实际是在一个独立的jQuery对象,只能通过jQuery.[函数名]的形式引用。

merge实际的功能是合并两个数组或者类数组对象,放到第一个对象中,并设置他们合并后的长度。pushStatic调用了merge,第一个参数为jQuery空对象(this.constructor()),将第二个数组或者类数组合并到jQuery空对象中,形成新的jQuery对象,并返回。

eq的功能就是get的功能多一个转化成jQuery对象,调用pushStatic,并返回其返回值一个新的jQuery对象。

first和last和end

  1.   first: function() {
  2. return this.eq( 0 );
  3. },
  4.  
  5. last: function() {
  6. return this.eq( -1 );
  7. },
  8.  
  9. end: function() {
  10. return this.prevObject || this.constructor(null);
  11. },

jQuery源码笔记——三的更多相关文章

  1. jQuery源码笔记(一):jQuery的整体结构

    jQuery 是一个非常优秀的 JS 库,与 Prototype,YUI,Mootools 等众多的 Js 类库相比,它剑走偏锋,从 web 开发的实用角度出发,抛除了其它 Lib 中一些中看但不实用 ...

  2. Tomcat8源码笔记(三)Catalina加载过程

    之前介绍过 Catalina加载过程是Bootstrap的load调用的  Tomcat8源码笔记(二)Bootstrap启动 按照Catalina的load过程,大致如下: 接下来一步步分析加载过程 ...

  3. jQuery源码解读三选择器

    直接上jQuery源码截取代码 // Map over jQuery in case of overwrite _jQuery = window.jQuery, // Map over the $ i ...

  4. jQuery源码笔记(二):定义了一些变量和函数 jQuery = function(){}

    笔记(二)也分为三部分: 一. 介绍: 注释说明:v2.0.3版本.Sizzle选择器.MIT软件许可注释中的#的信息索引.查询地址(英文版)匿名函数自执行:window参数及undefined参数意 ...

  5. jQuery 源码解析(三) pushStack方法 详解

    该函数用于创建一个新的jQuery对象,然后将一个DOM元素集合加入到jQuery栈中,最后返回该jQuery对象,有三个参数,如下: elems Array类型 将要压入 jQuery 栈的数组元素 ...

  6. jQuery 源码解析(三十) 动画模块 $.animate()详解

    jQuery的动画模块提供了包括隐藏显示动画.渐显渐隐动画.滑入划出动画,同时还支持构造复杂自定义动画,动画模块用到了之前讲解过的很多其它很多模块,例如队列.事件等等, $.animate()的用法如 ...

  7. jQuery源码笔记——二

    jQuery选择这样返回对象 var jQuery = function( selector, context ) { return new jQuery.fn.init( selector, con ...

  8. jQuery源码笔记——回调对象

    回调对象是一个多用途的回调列表对象,提供了强大的的方式来管理回调函数列表. 最简单的缓存对象 function Callbacks(){ var list = [], self = { add: fu ...

  9. jQuery源码笔记——延迟对象

    提供一种方法来执行一个或多个对象的回调函数, Deferred对象通常表示异步事件. 它是回调对象的拓展运用,在jQuery当中非常依赖回调对象. 一个简单的,只解决成功状态下的缓存实例 functi ...

随机推荐

  1. #include <queue>

    双端队列deque比向量vector更有优势 双端队列(deque) 连续存储的指向不同元素的指针所组成的数组<deque> 队列(queue) 先进先出的值的排列 <queue&g ...

  2. UIScrollView 与 UIPageView 的联合使用

       @interface ViewController : UIViewController<UIScrollViewDelegate> { UIScrollView * scrollV ...

  3. RHEL5.8安装Oracle11g

    1.安装环境[root@rusky-oracle11g ~]# uname -r2.6.18-308.el5[root@rusky-oracle11g ~]# cat /etc/issueRed Ha ...

  4. javascript模式——Prototype模式

    GoF权威的解释是,原型模式是一种通过对一个对象的克隆,创建基于这个对象的多种对象的模式. 为了实现这种原型模式,可以直接使用ECMAScript 5 中的方法Object.create.它不紧可以创 ...

  5. UVA 714 Copying Books

    题意: 要抄N本书,编号为1,2,3...N, 每本书有1<=x<=10000000页, 把这些书分配给K个抄写员,要求分配给某个抄写员的那些书的编号必须是连续的.每个抄写员的速度是相同的 ...

  6. uploadify控件使用在.net

    第一次是博客,还有丢丢小兴奋呢.作为一个资深菜鸟,为了给自己留下点什么,开始记录一些技术问题.当然也是学习过程.    下面是成品的在.net web下的应用,还有很多不足的地方,期待大家的点评. $ ...

  7. SQL Server 死锁检查

    示例代码 select spid, blocked, status, hostname, program_name, hostprocess, cmd from sysprocesses -- kil ...

  8. DataTable转换为LIST

    public List<string[]> SetList(DataTable dt)        {            List<string[]> list = ne ...

  9. Linux下进程的文件访问权限

    本文转自 http://blog.csdn.net/chosen0ne/article/details/10581883 对进程校验文件访问权限包括两个部分,一是确定进程的角色(属于哪个用户或者组), ...

  10. Redis的安装和配置

    在网站redis.io复制下载链接 wget http://download.redis.io/releases/redis-3.0.5.tar.gz tar zxvf redis-3.0.5.tar ...