jQuery源码分析

文章只讨论内部的方法,至于结构什么的并不在讨论范围以内

function DOMEval( code, doc ) {
        doc = doc || document;
        var script = doc.createElement( "script" );
        script.text = code;
        doc.head.appendChild( script ).parentNode.removeChild( script );
}

如上方法的作用是在html文档中增加一个script的节点并立即执行该script节点中所写的脚本,然后再从html文档中删除该script节点,使之与原文档一致。这个属于jQuery内部方法。

var arr = [];

var document = window.document;//文档

var getProto = Object.getPrototypeOf;//得到某个对象的原型

var slice = arr.slice;//数组的裁剪方法

var concat = arr.concat;//数组的连接方法

var push = arr.push;//数组的插入方法

var indexOf = arr.indexOf;//返回某个值在数组中的第一个匹配项的索引

var class2type = {};

var toString = class2type.toString;

var hasOwn = class2type.hasOwnProperty;//确定某个对象是否具有带指定名称的属性(必须是自己的,而不是在原型中)

var fnToString = hasOwn.toString;//

var ObjectFunctionString = fnToString.call( Object );//"function Object() { [native code] }"

var support = {};

以上是jQuery内置的一些参数

toArray: function() {
        return slice.call( this );
}

将对象转化为数组,this所表示的对象必须是可枚举的,实现了Iterator接口的

//$("div").get(1)  返回指定位置的dom元素
    get: function( num ) {

        // Return all the elements in a clean array
        //可以直接返回 this 
        if ( num == null ) {
            return slice.call( this );
        }

        // Return just the one element from the set
        return num < 0 ? this[ num + this.length ] : this[ num ];
    }
isWindow: function( obj ) {
        return obj != null && obj === obj.window;
    }

上方法判断是否是window对象

isPlainObject: function( obj ) {
        var proto, Ctor;

        // Detect obvious negatives
        // Use toString instead of jQuery.type to catch host objects
        if ( !obj || toString.call( obj ) !== "[object Object]" ) {
            return false;
        }

        proto = getProto( obj );//Object.getPrototypeOf(a) 得到a的原型对象

        // Objects with no prototype (e.g., `Object.create( null )`) are plain
        //通过 var n = Object.create(null) 创造出来的对象,其原型是 Object.getPrototypeOf(n)     
       //=== null n.__proto__===undefined
        //Object.getPrototypeOf(null) || Object.getPrototypeOf(undefined) 会抛错
        if ( !proto ) {
            return true;
        }

        // Objects with prototype are plain iff they were constructed by a global Object function
        //c语言中&&是一种双目运算符,表示与运算,而当左边所给表达式或变量为0时,不再计算右侧,整个表达式为零。
        //在js中当 第一个返回是 0 "" null undefined false 时候 返回第一个 否则返回第二个
        Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
        return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
    }

以上方法判断该对象是否是纯的对象

isEmptyObject: function( obj ) {

        /* eslint-disable no-unused-vars */
        // See https://github.com/eslint/eslint/issues/6125
        var name;

        for ( name in obj ) {
            return false;
        }
        return true;
    }

以上方法判断是否为空对象

type: function( obj ) {
        if ( obj == null ) {
            return obj + "";
        }// null+"" == "null"

        // Support: Android <=2.3 only (functionish RegExp)
        return typeof obj === "object" || typeof obj === "function" ?
            class2type[ toString.call( obj ) ] || "object" :
            typeof obj;
    }

以上方法判断对象的类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值