jquery 源码分析五

突然发现接下来马上就是Sizzle的核心代码了,这次就简单分析下Sizzle前面的剩下的代码。这次的篇幅会很短,因为剩下的代码就两段了,就当为Sizzle分析蓄力吧~

话说,尝试着把博客变成响应式布局了(简单粗略版),不知道有没有人发现~

首先是class2type,class2type中保存了一下[object name]-name的键值对,就是为了在判断类型的时候使用。这里使用了each函数来对字符串split后形成的array进行循环添加到class2type中。看代码:

jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
    class2type[ "[object " + name + "]" ] = name.toLowerCase();
});

这样,在toString()方法调用后返回的值可以直接使用class2type来返回正确的类型了。

第二段函数是isArraylike,这个是用来判断某个对象是否像数组,就是有length,同时从0到length-1都是有对应的值得,这样就可以认为这个对象像一个数组了。同时,默认nodeList是像数组的,代码如下:

function isArraylike( obj ) {
    var length = obj.length,
        type = jQuery.type( obj );
        
        // 若为函数,或者是window,那么直接返回false
    if ( type === "function" || jQuery.isWindow( obj ) ) {
        return false;
    }

        // 若nodeType == document.ELEMENT_NODE并且有length,就认为是像array
    if ( obj.nodeType === 1 && length ) {
        return true;
    }

       // 有length,并且length的最后一项存在obj中
    return type === "array" || length === 0 ||
        typeof length === "number" && length > 0 && ( length - 1 ) in obj;
}

这样就可以用来判断是否是像array了。

====================================================================

前面几篇有一点没有注意的地方,就是extend到jQuery和jQuery.prototype上的函数作用是不同的。

extend到jQuery上的函数是通过$.method()方式调用的,比如$.dir()。而extend到jQuery.prototype上的话,就是通过$().method()来调用的,比如:$().find()

原文地址:https://www.cnblogs.com/cyITtech/p/3588790.html