zoukankan      html  css  js  c++  java
  • 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 );
    	},



  • 相关阅读:
    Send or receive files via Xshell
    git archive命令详解
    test命令详解
    shell中的数学运算
    深入理解文件权限
    rebuild online时意外中断 再次重建时报错解决方法
    关于临时表空间,在日常生产中会遇到的问题
    Oracle对于敏感数据的处理,可以采用策略(dbms_rls.add_policy)
    我对于B-树索引的内部结构与索引类型所做的笔记
    记一次ADG备库归档目录满导致的延时处理
  • 原文地址:https://www.cnblogs.com/hdchangchang/p/3965315.html
Copyright © 2011-2022 走看看