jQuery在初始化过程中会为自己扩展一些基本的静态方法和属性,以下是jQuery 1.11.3版本 239 ~ 564行间所扩展的静态属性和方法

 
 jQuery.extend({

 // 为每个jQuery拷贝建立一个唯一的编号
expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), // 假设jQuery脱离模块支持,已经准备好
isReady: true, // 空转函数
noop: function() {}, /******************* 基本类型判断方法 *****************************/ isFunction: function( obj ) {
return jQuery.type(obj) === "function";
},
isArray: Array.isArray || function( obj ) {
return jQuery.type(obj) === "array";
},
isWindow: function( obj ) { /* jshint eqeqeq: false */
return obj != null && obj == obj.window;
}, isNumeric: function( obj ) {
// 首先抛弃数组, 利用parseFloat返回一个浮点数
// 如果obj是一个合法数字(包括字符串数字),与parseFloat返回值的差是0,因此相减后等0,于是加1
// 如果obj是"0x10",返回值则是0,而obj - 0则会得到16,因此判断"0x10"也是数值
// 如果obj是"abc"等非法数字,会得到NaN - NaN,最终也会得到非数值的判断 return !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 1) >= 0;
},
// 保证obj不包含任何属性
isEmptyObject: function( obj ) {
var name;
for ( name in obj ) { return false;
}
return true;
},
// 最常使用的判断之一,纯对象判断
// 纯对象是有 new 或 {} 创建的对象
// 意味着纯对象不能从其他对象原型中继承而来,只能从Object原型中继承
isPlainObject: function( obj ) {
var key;
// 首先必须是一个object
// 针对IE,需要检查对象的constructor属性
// 把DOM节点和window对象都过滤掉
if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
return false;
}
try {
// Not own constructor property must be Object
if ( obj.constructor && // 不包含构造器
!hasOwn.call(obj, "constructor") &&
!hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
return false;
} } catch ( e ) {
// IE8或9在某些主机上会抛出异常
return false;
}
// 支持: IE<9
// 先处理继承的属性,之后才会处理自身属性
if ( support.ownLast ) {
for ( key in obj ) {
return hasOwn.call( obj, key );
}
}
// 一般浏览器是先遍历自己的属性,因此利用空变量来略过之前的自身属性,直接跳到最后一个属性
// 如果最后一个属性是自身的,那么证明了所有属性都是自身的
for ( key in obj ) {}
return key === undefined || hasOwn.call( obj, key );
}, /********************** 基本工具 **********************/ type: function( obj ) {
if ( obj == null ) {
return obj + ""; // 返回一个字符串 'null'
} // //jQuery初始化过程中会产生一个"class到type"的表
// jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
// class2type[ "[object " + name + "]" ] = name.toLowerCase();
// });
// // 实际上class2type是这样的
// var class2type = {
// "[object Array]": "array",
// "[object Boolean]": "boolean",
// "[object Date]": "date",
// "[object Function]": "function",
// "[object Number]": "number",
// "[object Object]": "object",
// "[object RegExp]": "regexp",
// "[object String]": "string",
// "[object Error]" : "error",
// };
// toString(123) 实际上会返回一个字符串"[object Number]",此时就可以通过class2type表来返回"number"
// type(123) 返回的就是"number"
// 这样做的原因是,对于很多对象,typeof返回的只是object,无法区分具体是什么对象
// 通过object.prototype.toString.call(obj),虽然可以判断出什么对象,但是返回值却不够简练,因此使用了class2type进行映射
return typeof obj === "object" || typeof obj === "function" ?
class2type[ toString.call(obj) ] || "object" : // 通过class2type来返回object类型
typeof obj;
},
// Evaluates a script in a global context
// 在全局上下文上执行一个脚本
globalEval: function( data ) {
if ( data && jQuery.trim( data ) ) {
// IE上使用execScript
// 使用一个匿名函数,从而使上下文在firefox中变成window而非jQuery
( window.execScript || function( data ) {
window[ "eval" ].call( window, data );
} )( data );
}
},
// 转换 dashed to camelCase; CSS和数据模块才使用这个方法
// 首先要去除'-ms-'中的第一个'-'
// 然后删除'-'并将'-'后紧接着的字母转换成大写
// rmsPrefix = /^-ms-/
// rdashAlpha = /-([\da-z])/gi
// fcamelCase = function( all, letter ) {
// return letter.toUpperCase();
// };
camelCase: function( string ) {
return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
},
// 判断elem节点的名字是否为name
// 在后面对节点的操作经常会用到
nodeName: function( elem, name ) {
return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
},
});
总结
  • 基本判断方法里,jQuery.isNumeric的实现过程比较简练,要判断"0x10"这样的十六进制数字,又要判断"1.23"这样的浮点数.该方法里面只使用到了parseFloat,并根据其返回值的特点("字符串前部的合法数字"),只使用一次函数就可判别出数字,实现得非常精明;
  • 纯对象的判断jQuery.isPlainObject也是用得较多的工具,其中针对浏览器的兼容性实现和优化都值得学习;
  • jQuery.type的实现方案更加精彩,因此不同平台上typeof不一定能够准确返回对象的类型,因此需要使用到Object.ptototype.toString方法,然而这个方法会返回不需要的字符,建立一个映射表便可解决这一个问题;

jQuery 源码分析5: jQuery 基本静态方法(一)的更多相关文章

  1. jQuery源码分析之=>jQuery的定义

    最近写前段的代码比较多,jQuery是用的最多的一个对象,但是之前几次看了源码,都没搞清楚jQuery是怎么定义的,今天终于看明白怎么回事了.记录下来,算是一个新的开始吧. (文中源码都是jQuery ...

  2. jQuery 源码分析4: jQuery.extend

    jQuery.extend是jQuery最重要的方法之一,下面看看jQuery是怎样实现扩展操作的 // 如果传入一个对象,这个对象的属性会被添加到jQuery对象中 // 如果传入两个或多个对象,所 ...

  3. jQuery 源码分析3: jQuery.fn/ jQuery.prototype

    // 建立方法实例,提高方法访问的速度(避免在原型链上搜索) var deletedIds = []; var slice = deletedIds.slice; var concat = delet ...

  4. jQuery 源码分析6: jQuery 基本静态方法(二)

    jQuery.extend({ // 遍历obj的所有值 // args 这参数只能内部调用的会用到 // 注意到,如果回调函数调用失败会直接跳出并中止遍历 // 当有args数组时,使用apply调 ...

  5. jQuery 源码分析2: jQuery.fn.init

    //jQuery.fn.intit 中使用到的外部变量: // 判断是否为HTML标签或#id rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w ...

  6. 六.jQuery源码分析之jQuery原型属性和方法

    97 jQuery.fn = jQuery.prototype = { 98 constructor: jQuery, 99 init: function( selector, context, ro ...

  7. jQuery源码分析系列

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

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

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

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

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

随机推荐

  1. Articulate Studio课间制作工具

    Articulate Studio可以说是目前国际上用户最广泛的e-learning课件制作工具之 一,通过Articulate Studio,你可以方便.快捷的创建引人入胜的Flash演示和e-le ...

  2. iframe中的各种跳转方法

    iframe中的各种跳转方法(转)   一.背景A,B,C,D都是jsp,D是C的iframe,C是B的iframe,B是A的iframe,在D中跳转页面的写法区别如下. 二.JS跳转window.l ...

  3. ELK beats通用配置说明(12th)

    Beats配置文件是以YAML语法,该文件包含用于所有的beats的通用配置选项,以及其特点的选项.下面说说通用的配置,特定的配置要看各自beat文档. 通用的配置如下几部分: Shipper Out ...

  4. Why Does Everyone Else Appear to Be Succeeding?

    Why Does Everyone Else Appear to Be Succeeding?  —Steven G. Krantz When you are a student, it will a ...

  5. 【转载】Android Studio 设置内存大小及原理

    http://www.cnblogs.com/justinzhang/p/4274985.html http://tsroad.lofter.com/post/376316_69363ae Andro ...

  6. 【32】确定你的public继承塑模出Is-A关系

    1.public继承表示Is-A关系,也就是满足里氏代换.与之相对应的,private继承表示根据某物实现出,不满足里氏代换.子类对象初始化父类引用,编译通不过. 2.考虑下面的需求,企鹅继承鸟,Bi ...

  7. 从Eclipse到Android Studio经历

    现在不得不要和相处近两年的Eclipse分手了,很舍不得,谢谢你这些日子有你的陪伴,每天都会有些的期待和挑战.两年来,我们建立了很深厚的情感.曾经以为我的世界只能有你,而现在我的心里可能有了别人.起初 ...

  8. 【C语言】字符串替换空格:实现一个函数,把字符串里的空格替换成“%20”

    //字符串替换空格:实现一个函数,把字符串里的空格替换成"%20" #include <stdio.h> #include <assert.h> void ...

  9. Jordan Lecture Note-8: The Sequential Minimal Optimization Algorithm (SMO).

    The Sequential Minimal Optimization Algorithm (SMO) 本文主要介绍用于解决SVM对偶模型的算法,它于1998年由John Platt在论文“Seque ...

  10. java_jdbc_spring框架查询操作简例

    1.添加commons-dbcp-1.4,commons-logging,commons-pool-1.2//线程池,commons.collections-3.2.1.jar,spring.jar ...