jQuery源码阅读(十)---jQuery静态方法分析
来源:互联网 发布:js定义map对象 编辑:程序博客网 时间:2024/05/21 12:49
jQuery工具方法(静态方法)是通过jQuery.extend方法来挂在的,extend方法的源码实现在这篇博客中也有整理过。现在简单回顾下,当jQuery.extend中的参数为一个对象时,就是扩展插件的方式,也就是说里面的方法都会扩展到jQuery上。因此,jQuery工具方法就是这样实现的。
jQuery.extend({ //里面可以扩展的方法 noConflict: function(){ //释放jQuery 对 $ 或者 jQuery 的使用权 }, ready: function(fn){ jQuery.bindReady(); readyList.add(fn); return this; }, isFunction: fucntion( obj ){ }, isArray: function( obj ){ }, isWindow: function( obj ){ }, isNumeric: fucntion( obj ){ }, type: function( obj ){ }, isPlainObject: function( obj ){ }, isEmptyObject: function( obj ){ }, error: function( msg ){ }, parseXML: function( data ){ }, parseJSON: function( data ){ }, noop: function(){ }, globalEval: function(){ } //等等,后面还有很多工具方法});
前面两篇博客(noConflict函数解析 和 jQuery ready函数解析)已经把noConflict 和ready函数这两个方法做了整理,这一次先整理关于类型检测的工具方法,即isFunction( obj )、isArray( obj )、isNumeric( obj )、type( obj )、isWindow( obj )、isPlainObject( obj )和 isEmptyObject( obj )
这几个函数。
isFunction函数
function( obj ){ return jQuery.type(obj) === 'function';}
很简单,直接调jQuery类型检测type函数 ,判断type得到的类型是否与’function’相等。
jQuery.isArray函数
isArray: Array.isArray || function( obj ){ return jQuery.type( obj ) === 'array';}
一般来讲,利用ES5提供的原生方法isArray是比较快的, 但在某些浏览器不支持ES5这种方法时,就调jQuery工具方法type来判断。
在这里想到,之前电面时遇到的一道面试题:
如何判断一个对象是数组类型?有几种方法?
这里也简单总结下:
1. Array.isArray(obj); //返回true Or false2. obj instanceof Array //返回true Or false3. Object.prototype.toString.call(obj) //返回类型,如果是数组,返回是'[object Array]'
以上三种方法也有适用性。比如原生的isArray方法,如果浏览器不支持ES5,那么这种方法是不起作用的;instanceof 的话,如果有多个全局环境,比如iFrame,那么instanceof会受环境的影响。详见高程第22章高级技巧。
jQuery.isNumeric方法
function( obj ){ return !isNaN( parseFloat( obj )) && isFinite( obj );}
在JS中,typeof NaN
也是返回number;所以如果用jQuery.type()方法来判断的话,是不会过滤掉NaN。另一方面,计算机中数值是有最大最小值的,Number.MAX_VALUE和Number.MIN_VALUE
就可以知道最大最小值,所以当数值超过最大最小值时,也就没有意义了。因此要利用原生方法isFinite()检查数值是否超过边界。
isWindow方法
function( obj ){ return null != obj && obj == obj.window;}
window一方面可以是全局对象,一方面又可以是窗口。所以window.window是存在的,并且等于Window对象。
因此,只有当obj = window时,obj == obj.window才返回true。
isPlainObject方法
这个函数是判断一个对象是否为对象字面值。
在这一篇博客中,有说过对象的创建方式,有new方法,有工厂模式,也有对象字面值等等,而isPlainObject
方法是判断对象为对象字面值或者利用Object()构造函数new出来的对象。
function( obj ){ //对于空对象,类型为Array,String,Function,Date...等不是'object'类型的对象,还有DOM对象,Window对象的情况,都认为不是PlainObject if(!obj || jQuery.type( obj ) !== 'object' || obj.nodeType || jQuery.isWindow( obj )) { return false; } //对于利用构造函数new出来的对象,但构造函数不是Object,也认为不是PlainObject try { // 对于自定义构造函数,然后利用自定义构造函数生成的对象,jQuery.type()返回的是"object" // 所以才有下面的判断,判断构造函数,判断constructor不是自身的属性,并且'isPrototypeOf'不是构造函数的原型自身的属性,返回false if ( obj.constructor && !hasOwn.call(obj, "constructor") && !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { return false; } } catch ( e ) { // IE8,9 Will throw exceptions on certain host objects #9897 return false; } //个人觉得,下面这部分直接用 //return true //来代替就可以了 var key; for ( key in obj ) {} //此时key 等于obj中最后一个属性名/方法名 return key === undefined || hasOwn.call( obj, key );}
其中
hasOwn = Object.prototype.hasOwnProperty;
这也是jQuery的一大技巧,就是把很多使用比较频繁的,并且很长的语句用很短的有含义的语句来代替,从而缩小了代码量,一定程度上也能提高性能。
而在jQuery2.0版本中,前面两种情况都处理过并未返回false之后,直接返回true.
isEmptyObject方法
空对象里面是没有属性和方法的,所以用for … in来遍历空对象时,是不会进到循环里面的。
function( obj ){ var key; for(key in obj) { return false; } return true;}
关于类型检测的一些静态方法基本上整理完了,希望大家可以一起探讨学习!
- jQuery源码阅读(十)---jQuery静态方法分析
- jQuery-源码阅读,init()方法
- jQuery源码阅读(六)---jQuery实例方法解析
- jQuery静态方法parseJSON方法使用和源码分析
- jQuery源码分析9--静态与实例方法共享设计
- jQuery源码研究分析学习笔记-静态方法和属性(10)
- jquery源码阅读知识储备(11)数学方法(四舍五入)
- jQuery源码阅读(二)---初识init方法
- jQuery-源码阅读,pushStack()入栈方法
- jQuery源码分析之$.extend() --静态扩展
- jquery源码阅读jQuery.inArray()
- [ jQuery ] jQuery 源码分析!
- jQuery源码阅读有感
- jQuery源码阅读笔记
- jQuery源码阅读笔记
- jQuery源码阅读(一)---jQuery源码整体架构
- jQuery.extend()方法和jQuery.fn.extend()方法源码分析
- jQuery源码阅读(四)--正则表达式
- spring的组件扫描和自动装配
- logback-Appender 自定义详解
- Idea快捷键
- 安卓Fragment的用法
- Toast in Web,网页版Toast实现
- jQuery源码阅读(十)---jQuery静态方法分析
- 指针和引用
- 二叉树问题1
- 通过新浪云部署Node.js微信小程序商城(不用买域名、不用备案、不用配置https)
- nginx设置成服务并开机自动启动
- php安装扩展gd
- Mysql 日常积累
- windows7下git生成ssh key
- Bootstrap之Datatables实践总结