jQuery源码学习之七 (jQuery中扩展方法)

接下来分析扩展到 jQuery 的方法

jQuery.extend({  
   ... 
   isFunction:判断传入的是否是函数,   
   isArray:判断传入的是否是数组,
   isWindow:判断传入的是否是window对象,
   isNumeric:判断传入的是否是num,
   type:判断传入参数的类型,
   isPlainObject:,
   isEmptyObject:参数是否是空对象,
   error:抛出错误,
    ...  
 }) 
isFunction:内部调用$.type()
isFunction: function( obj ) {
		return jQuery.type(obj) === "function";
	},
isArray::新版本js自带的方法Array.isArray
isArray: Array.isArray,
isWindow:window的window属性等价于 window的self 属性,它包含了对窗口自身的引用
isWindow: function( obj ) {
		return obj != null && obj === obj.window;
	}

isNumeric:利用 typeof 验证NaN返回的是仍是number,所以没有用 typeof

isNumeric: function( obj ) {
		return !isNaN( parseFloat(obj) ) && isFinite( obj );
	},
type:

1、判断null==null 或者undefined==null都会返回true。

2、typeof(null) 返回的是object;typeof(undefined)可以得到字符串 “undefined”;

3、String(obj) 首先会看obj有没有toString()方法,有的话直接调用。而没有toString方法的只有null 和undefined,则返回相应的null和undefined。

综上看出 type()方法中的if中返回的是字符串形式的 null 或者 undefined。

一般判断null会用到“===”,而判断undefined会用到typeof ;

注:某些低版本浏览器 typeof 正则的时候会返回“function”

当参数obj是number或string的时候直接返回 typeof obj;否则等于class2type[ core_toString.call(obj) ]

class2type = {},
... 
core_toString = class2type.toString,
...
jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
    class2type[ "[object " + name + "]" ] = name.toLowerCase();
});
...
type: function( obj ) {
		if ( obj == null ) {
			return String( obj );
		}
		// Support: Safari <= 5.1 (functionish RegExp)
		return typeof obj === "object" || typeof obj === "function" ?
			class2type[ core_toString.call(obj) ] || "object" :
			typeof obj;
	}

Object.prototype.toString.call(obj)  等价于 {}.toString.call(obj)  经常用来判断传入的obj的类型,这里也用到了。

class2type中的下标对应的是Object.prototype.toString.call(obj)的不同类型的返回值。

jQuery 巧妙的将类型存入到数组class2type中,最后得到的class2type:

class2type[[object Boolean]] = "boolean"
class2type[[object Number]] = "number"
class2type[[object String]] = "string"
class2type[[object Funtion]] = "funtion"
class2type[[object Array]] = "array"
class2type[[object Date]] = "date"
class2type[[object RegExp]] = "regexp"
class2type[[object Object]] = "object"
class2type[[object Error]] = "error"

isPlainObject:

if 判断排除了DOM节点 window对象以及$.type 返回的不是object的情况。

try catch 中if判断的根据是只有Objectd的prototype中才有自带的“isPrototypeOf”属性

class2type = {},
...
core_hasOwn = class2type.hasOwnProperty,
...
isPlainObject: function( obj ) {
   if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
      return false;
   }
   try {
      if ( obj.constructor && !core_hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) {
        return false; 
      }  
   } catch ( e ) {
        return false;   
   }    
return true;  
},


isEmptyObject:js自带的属性for in不到

isEmptyObject: function( obj ) {
		var name;
		for ( name in obj ) {
			return false;
		}
		return true;
	},
error:调用js原生的throw new Error();

error: function( msg ) {
		throw new Error( msg );
	},



posted @ 2014-08-09 20:13  hdchangchang  阅读(144)  评论(0编辑  收藏  举报