在jQuery.js的构造函数中,充分利用了JavsScript语言的动态性——对行参的类型和个数没有的严格要求,以至于一个函数可以实现多种功能需求,也为JavaScript语言的多态性提供了基础,在这个构造函数中,提供了六种不同的调用格式(根据官方API文档),具体如下($ = jQuery):

  1、$(String expr):根据给定的CSS选择符查找匹配的元素,如$("div>p");
  2、$(Element elem):将给定的DOM元素对象转换为jQuery对象,如$(document).find("div>p");
  3、$(Array<Element> elems):如$(myForm.elements).hide();
  4、$(Function fn):是$(document).ready()的简写模式,如:$( function fn(){ ... } );
  5、$(jQuery obj):如:var div = $("div");   $(div).find("p");
  6、$(String expr, Element context):在context中查找expr,如:$("div", xml.responseXML);

  另外,jQuery中提到了Chainable Methods的思想,也就是调用jQuery中的方法会返回一个jQuery对象,仍然可以继续调用其中的方法,这样,就形成了一个“链条”,通过“.”一个一个调用下去,这个在构造函数中有具体体现,其中有如下一条语句:

  if( window == this ) return new jQuery( a, c );

  这个就是为了返回一个jQuery对象,在首次调用jQuery( a, c )函数时,this是等于window的,所以每次都会创建一个jQuery对象,更详细的代码分析见下:

// jQuery的构造函数;
var jQuery = function( a, c ) {
    // $(document).ready()的简写形式,只有在$(function(){ })下才会执行;
    if ( a && typeof a == "function" && jQuery.fn.ready ) return jQuery(document).ready(a);

// 确保参数a非空,默认值为document;
     a = a || jQuery.context || document;

// 如果参数a是jQuery对象(a.jquery="1.0.3"),则克隆一个与a相同的jQuery对象;
    if ( a.jquery ) return jQuery( jQuery.merge( a, [] ) );

// 从给定的参数c(要求c必须是jQuery对象)中查找a;
    if ( c && c.jquery ) return jQuery( c ).find( a );

// 如果是初次调用$(),因为在window环境下,所以创建一个新的jQuery对象,如果去掉new则循环执行;
    if ( window == this ) return new jQuery(a,c);

// 分析HTML串,如“div<ul>p”;
    if ( a.constructor == String ) {
        var m = /^[^<]*(<.+>)[^>]*$/.exec( a );
        if ( m ) a = jQuery.clean( [ m[ 1 ] ] );
     }

// 如果参数a是元素数组,则要执行jQery.merge(),否则要执行jQuery.find();
    this.get( a.constructor == Array || a.length && !a.nodeType && a[0] != undefined && a[0].nodeType
        ?  // 处理元素数组;
             jQuery.merge( a, [] )
         :  // 查找相匹配的元素并保存;
             jQuery.find( a, c ) );

// 如果附加了另外的函数,则在每个相匹配的jQuery对象上执行这个函数;
    var fn = arguments[ arguments.length - 1 ];
    if ( fn && typeof fn == "function" ) this.each( fn );

return this;

}; //jQuery的结束;

jQuery源码分析-构造函数详解的更多相关文章

  1. 【Java】HashMap源码分析——常用方法详解

    上一篇介绍了HashMap的基本概念,这一篇着重介绍HasHMap中的一些常用方法:put()get()**resize()** 首先介绍resize()这个方法,在我看来这是HashMap中一个非常 ...

  2. JQuery 源码解析 · extend()详解

    前言:最近想重写一个dropdown插件,于是想到了使用jquey实现插件,于是重温了一波$.extend()的知识,然后总结了这篇笔记 正文: $.extend(src)  jQuery.exten ...

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

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

  4. jQuery源码分析系列

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

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

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

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

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

  7. Android源码下载方法详解

    转自:http://www.cnblogs.com/anakin/archive/2011/12/20/2295276.html Android源码下载方法详解 相信很多下载过内核的人都对这个很熟悉 ...

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

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

  9. jQuery源码分析-each函数

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

随机推荐

  1. android onPause OnSavedInstance

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 活动 的 在暂停时候 这个方法  执行结束后,才会执行 下一个活动的 在创建时候 的那个 ...

  2. Western Subregional of NEERC, Minsk, Wednesday, November 4, 2015 Problem G. k-palindrome dp

    Problem G. k-palindrome 题目连接: http://opentrains.snarknews.info/~ejudge/team.cgi?SID=c75360ed7f2c7022 ...

  3. 操作iframe 的方法与兼容性

    首先创建两个页面 //iframe1.html <!DOCTYPE html> <html lang="en"> <head> <meta ...

  4. 微信小程序自定义音频组件,自定义滚动条,单曲循环,循环播放

    小程序自定义音频组件,带滚动条 摘要:首先自定义音频组件,是因为产品有这样的需求,需要如下样式的 而微信小程序API给我们提供的就是这样的 而且产品需要小程序有后台播放功能,所以我们不考虑小程序的 a ...

  5. [原创]浅谈H5页面测试介绍

    [原创]浅谈H5页面测试介绍 目前移动互联网非常火热,除了各种App,H5也是非常热,由于H5跨平台,且版本更新容易,做为引流或获客是非常好的一种简单低成本平台:今天来谈谈H5页面测试都要测试什么? ...

  6. STM32F2x Is it possible to request multiple DMA streams with single request

    I want to setup an application, where a single trigger-factor (compare-match of a timer) shall reque ...

  7. PHP项目收藏

    API接口管理系统 Github上的PHP资源汇总大全 Github.com上有哪些比较有趣的PHP项目 SOAP NuSOAP - SOAP Toolkit for PHP [官网] [教程] 通用 ...

  8. swift笔记(二) —— 运算符

    基本运算符 Swift支持大部分的标准C语言的操作符,而且做了一些改进,以帮助开发人员少犯低级错误,比方: 本该使用==的时候,少写了个=, if x == y {-} 写成了 if x = y {- ...

  9. CPU和线程的关系

    比如,电脑开了两个程序qq和qq音乐,假设这两个程序都只有一个线程.人能够感觉到CPU切换的频率是一秒一次,假设当前cpu计算速度是1秒1次,那么我们就能明显感到卡顿,当聊天,点击发送按钮时候,qq音 ...

  10. 关于unity里pbr技术和材质 unity5默认shader和传统的对比

    刚开始也不知道什么是pbr (Physically Based Rendering)后来才发现这是一种新的渲染方式 与之对应的是材质是pbs(Physically Based Shader) unit ...