jQuery的工具方法,其实就是静态方法,源码里面就是通过extend方法,把这些工具方法添加给jQuery构造函数的。

jQuery.extend({

  ......  

  type: function( obj ) {    //$.type(),判断类型
    if ( obj == null ) {   //null,undefined
      return String( obj );    //返回null,undefined字符串
    }     //core_toString = {}.toString 
    return typeof obj === "object" || typeof obj === "function" ?
      class2type[ core_toString.call(obj) ] || "object" :     //number,string等包装类型,typeof判断是object,所以进入到toString判断,最终返回number,string

        typeof obj;       //基本类型,number,string直接用typeof.
  }, 

  isPlainObject: function( obj ) {   //判断是否是对象自变量,{},new Object
    if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
      return false;    //dom节点,window等是object,但是不是对象自变量。
    }

    try {     //window.location是object,core_hasOwn是{}.hasOwnProperty(自己的属性,不是原型的属性)
      if ( obj.constructor && !core_hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) {
        //isPrototypeOf只存在object.prototype对象中,core_hasOwn.call( obj.constructor.prototype, "isPrototypeOf" )这句话的意思就是:obj.constructor.prototype是否有isPrototypeOf属性,从上可知,只有object.prototype有,所以只有object.prototype才返回真。比如,我传入一个Person(构造函数),它的原型没有isPrototypeOf属性,所以返回false。Person不是对象自变量。

        return false;
      }//在火狐20以下版本,如果操作window.location.constructor 多次,会抛错
    } catch ( e ) {
      return false;
    }

    return true;
  },

  isEmptyObject: function( obj ) {  //{},[],对象自身下没有属性和方法就返回true。function Person(){} ;var person = new Person(),返回true

    var name;
    for ( name in obj ) {     //系统自带的属性和方法不会for in打印出来。
      return false;
    }
    return true;
  }, 

  parseHTML: function( data, context, keepScripts ) {   //解析字符串为数组节点,比如:"<li></li>" -> [li元素]

    //keepScripts 为true,可以解析script,false不能解析script标签
    if ( !data || typeof data !== "string" ) {  
      return null;
    }
    if ( typeof context === "boolean" ) {   //如果没有第二个参数
      keepScripts = context;
      context = false;
    }
    context = context || document;

    var parsed = rsingleTag.exec( data ),     //假如是单标签"<li></li>"
    scripts = !keepScripts && [];

    if ( parsed ) {    //直接创建这个元素,然后放进数组中返回
      return [ context.createElement( parsed[1] ) ];
    }

    parsed = jQuery.buildFragment( [ data ], context, scripts );

     //如果keepScripts为false,则会传入空数组scripts ,buildFragment会判断data中是否有script,如果有就放入空数组,变成[script],没有就返回[]。如果keepScripts为true,就传入false,buildFragment不对它做改变,还是false.

    if ( scripts ) {
      jQuery( scripts ).remove();   //移除script标签
    }

    return jQuery.merge( [], parsed.childNodes );
  },//eval可以解析json字符串,任何格式的都可以,危险性提高。JSON.parse()只能解析标准的json字符串,性能好于eval。 

  parseXML: function( data ) {  //解析xml字符串为xml文档。
    var xml, tmp;
    if ( !data || typeof data !== "string" ) {
      return null;
    }

    try {
      tmp = new DOMParser();    //IE6-8使用ActiveXObject来解析
      xml = tmp.parseFromString( data , "text/xml" );

      //IE9下,如果xml字符串不是正常的xml标签,会报错。其他浏览器不会报错,会在返回的xml文档中生成parsererror节点
    } catch ( e ) {
      xml = undefined;
    }

    if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
      jQuery.error( "Invalid XML: " + data );
    }
    return xml;
  }, 

  globalEval: function( code ) {   //把局部变量变成全局变量,比如:"var a=1"。
    var script,
    indirect = eval;//eval既是关键字,又是window下的属性。直接写eval(code),浏览器会当做js关键字使用,出错。所以赋值一下,就会把eval当做window的属性。

    code = jQuery.trim( code );      //code必须为字符串形式

    if ( code ) {
      if ( code.indexOf("use strict") === 1 ) {  //严格模式下,不能使用eval.
        script = document.createElement("script");
        script.text = code;
        document.head.appendChild( script ).parentNode.removeChild( script );
      } else {
        indirect( code );
      }
    }
  },  

  camelCase: function( string ) {   //转驼峰,IE下:-ms-transform -> msTransform,而其他-moz-transform-> MozTransform,所以先把-ms-替换成ms-,这样就只会转成msTransform,m不会大写了。而其他浏览器需要大写
    return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
  },

  ......

})

加油!

jquery源码解析:type,isPlainObject,parseHTML,parseXML,globalEval详解的更多相关文章

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

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

  2. jQuery 源码分析(十) 数据缓存模块 data详解

    jQuery的数据缓存模块以一种安全的方式为DOM元素附加任意类型的数据,避免了在JavaScript对象和DOM元素之间出现循环引用,以及由此而导致的内存泄漏. 数据缓存模块为DOM元素和JavaS ...

  3. jQuery 源码分析(十九) DOM遍历模块详解

    jQuery的DOM遍历模块对DOM模型的原生属性parentNode.childNodes.firstChild.lastChild.previousSibling.nextSibling进行了封装 ...

  4. jQuery源码分析(九) 异步队列模块 Deferred 详解

    deferred对象就是jQuery的回调函数解决方案,它解决了如何处理耗时操作的问题,比如一些Ajax操作,动画操作等.(P.s:紧跟上一节:https://www.cnblogs.com/grea ...

  5. jQuery 源码解析二:jQuery.fn.extend=jQuery.extend 方法探究

    终于动笔开始 jQuery 源码解析第二篇,写文章还真是有难度,要把自已懂的表述清楚,要让别人听懂真的不是一见易事. 在 jQuery 源码解析一:jQuery 类库整体架构设计解析 一文,大致描述了 ...

  6. JQuery源码解析(一)

    写在前面:本<JQuery源码解析>系列是基于一些前辈们的文章进行进一步的分析.细化.修改而写出来的,在这边感谢那些慷慨提供科普文档的技术大拿们. 要查阅JQ的源文件请下载开发版的JQ.j ...

  7. jquery源码解析:代码结构分析

    本系列是针对jquery2.0.3版本进行的讲解.此版本不支持IE8及以下版本. (function(){ (21, 94)     定义了一些变量和函数,   jQuery = function() ...

  8. jquery 源码解析

    静态与实力方法共享设计 遍历方法 $(".a").each() //作为实例方法存在 $.each() //作为静态方法存在 Jquery源码 jQuery.prototype = ...

  9. jquery源码解析:addClass,toggleClass,hasClass详解

    这一课,我们将继续讲解jQuery对元素属性操作的方法. 首先,我们先看一下这几个方法是如何使用的: $("#div1").addClass("box1 box2&quo ...

  10. jquery源码解析:jQuery工具方法Callbacks详解

    我们首先来讲下Callbacks是如何使用的:第一个例子 function a(){} function b(){} var cb = $.Callbacks(); cb.add(a); cb.add ...

随机推荐

  1. linux开机自检配置文件fstab变只读无法修改问题

    控制linux开机自检的配置文件是/etc/fstab,在最近用的服务器中,发现fstab变成了只读权限,无法修改. 解决方法:RH5下,因磁盘改变,而导致系统停在Ctrl+d,此时需输入密码进入修改 ...

  2. Unity几个有用的游戏运动特效

    本文摘要 本文主要记录了我在开发格斗游戏时用到的几个运动特效,可以方便地表现武器挥动.运动模糊和其他一些特效.灵活使用可以大幅提升格斗游戏的视觉效果和感染力.有关Unity的其他话题也可以查阅我的其他 ...

  3. C语言中static修饰符的意义

    在C语言中,static通常有2种含义:1)定义变量的生命周期:2)定义变量或者函数的作用域. 变量的生命周期是指,相对于程序运行的进程生命周期,变量存在的时间段.变量的生命周期由变量的存储类型(位置 ...

  4. string.Empty与null与""

    (1)NULLnull 关键字是表示不引用任何对象的空引用的文字值.null 是引用类型变量的默认值.那么也只有引用型的变量可以为NULL,如果int i=null,的话,是不可以的,因为Int是值类 ...

  5. Opencv Harris角点检测

    #include <iostream>#include <opencv2/opencv.hpp> using namespace std;using namespace cv; ...

  6. python-nmap模块常用方法说明

    一.模块常用方法说明 本节介绍python-nmap模块的两个常用类,一个为PortScanner()类,实现一个nmap工具的端口扫描功能封装:另一个为PortScannerHostDict()类, ...

  7. gradle创建spring-boot项目

    刚来新公司,熟悉了公司项目搭建的框架,了解到了一种新的项目管理工具:gradle,从网上了解,据说比maven更加灵活化,于是便学习了一番.在此记录下来,一遍以后使用.gradle的安装就不说了,网上 ...

  8. webstorm最新破解方法

    方法来自 Rover12421 大神. 1.从官网下载WebStorm2016.1安装. 2.下载 破解补丁 并解压,记住路径 3.编辑WebStorm安装目录下 bin 文件夹中的 WebStorm ...

  9. Primer 三四五章

    序言 看了看表,再看了看书,2个小时就没啦(又到了吃中饭的时间,O(∩_∩)O哈哈~).一个上午感觉啥也没干呢,不过还是从书上看到了一些东西,对于这些基础的知识,还是有些东西没有记得很深,所以还是花了 ...

  10. Unable to locate JAR/zip in file system as specified by the driver definition: ojdbc14.jar

    eclipse的配置错误,把当前包删除,重新导入一个包.然后设置与需要的数据库对应,就可以了