jQuery 源码分析5: jQuery 基本静态方法(一)
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 基本静态方法(一)的更多相关文章
- jQuery源码分析之=>jQuery的定义
最近写前段的代码比较多,jQuery是用的最多的一个对象,但是之前几次看了源码,都没搞清楚jQuery是怎么定义的,今天终于看明白怎么回事了.记录下来,算是一个新的开始吧. (文中源码都是jQuery ...
- jQuery 源码分析4: jQuery.extend
jQuery.extend是jQuery最重要的方法之一,下面看看jQuery是怎样实现扩展操作的 // 如果传入一个对象,这个对象的属性会被添加到jQuery对象中 // 如果传入两个或多个对象,所 ...
- jQuery 源码分析3: jQuery.fn/ jQuery.prototype
// 建立方法实例,提高方法访问的速度(避免在原型链上搜索) var deletedIds = []; var slice = deletedIds.slice; var concat = delet ...
- jQuery 源码分析6: jQuery 基本静态方法(二)
jQuery.extend({ // 遍历obj的所有值 // args 这参数只能内部调用的会用到 // 注意到,如果回调函数调用失败会直接跳出并中止遍历 // 当有args数组时,使用apply调 ...
- jQuery 源码分析2: jQuery.fn.init
//jQuery.fn.intit 中使用到的外部变量: // 判断是否为HTML标签或#id rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w ...
- 六.jQuery源码分析之jQuery原型属性和方法
97 jQuery.fn = jQuery.prototype = { 98 constructor: jQuery, 99 init: function( selector, context, ro ...
- jQuery源码分析系列
声明:本文为原创文章,如需转载,请注明来源并保留原文链接Aaron,谢谢! 版本截止到2013.8.24 jQuery官方发布最新的的2.0.3为准 附上每一章的源码注释分析 :https://git ...
- [转] jQuery源码分析-如何做jQuery源码分析
jQuery源码分析系列(持续更新) jQuery的源码有些晦涩难懂,本文分享一些我看源码的方法,每一个模块我基本按照这样的顺序去学习. 当我读到难度的书或者源码时,会和<如何阅读一本书> ...
- jQuery 源码分析 8: 回头看jQuery的构造器(jQuery.fn,jQury.prototype,jQuery.fn.init.prototype的分析)
在第一篇jQuery源码分析中,简单分析了jQuery对象的构造过程,里面提到了jQuery.fn.jQuery.prototype.jQuery.fn.init.prototype的关系. 从代码中 ...
随机推荐
- Javascript注意事项二【避免误用parseInt】
parseInt("123abc"); //123parseInt("1.73"); //1parseInt(".123"); //NaN ...
- Jenkins 实际项目操作
.Abstract { padding: 15px; border: dotted 2px #999; color: #999; font-family: "Microsoft Yahei& ...
- ecshop去官方化的修改
1:如何修改网站"欢迎光临本店" 回答:languages\zh_cn\common.php文件中, $_LANG['welcome'] = '欢迎光临本店';将他修改成你需要的字 ...
- Css基础-派生选择器
如果要修改li strong 里面文字的颜色可以这样写样式 派生选择器: li strong { color:red; } 效果:
- Android设计模式系列--观察者模式
观察者模式,是一种非常常见的设计模式,在很多系统中随处可见,尤其是涉及到数据状态发生变化需要通知的情况下.本文以AbstractCursor为例子,展开分析.观察者模式,Observer Patter ...
- 【转】/etc/grub.conf文件详解
转自:http://leejia.blog.51cto.com/4356849/788902 grub.conf是grub的主配置文件,通过这个配置文件,grub才能找到kernel,系统才能正常启动 ...
- Android adt v22.6.2-1085508 自己主动创建 appcompat_v7 解决方法,最低版本号2.2也不会出现
Android 开发工具升级到22.6.2在创建project时仅仅要选择的最低版本号低于4.0,就会自己主动生成一个项目appcompat_v7,没创建一个新的项目都会自己主动创建,非常是烦恼... ...
- iOS开发——数据持久化Swift篇&iCloud云存储
iCloud云存储 import UIKit class ViewController: UIViewController { override func viewDidLoad() { super. ...
- 认识CoreData-多线程
CoreData使用相关的技术点已经讲差不多了,我所掌握的也就这么多了.... 在本篇文章中主要讲CoreData的多线程,其中会包括并发队列类型.线程安全等技术点.我对多线程的理解可能不是太透彻,文 ...
- 正则表达式 之 C#后台应用
正则表达式在.Net就是用字符串表示,这个字符串格式比较特殊,无论多么特殊,在C#语言看来都是普通的字符串,具体什么含义由Regex类内部进行语法分析. Regex 类 存在于 System.Text ...