`
zccst
  • 浏览: 3322665 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jquery核心功能分析

阅读更多
作者:zccst

核心功能包括:

jQuery是如何定义的,如何调用的,如何扩展的。掌握核心方法是如何实现的,是理解jQuery源码的关键。这里理解了一切豁然开朗。

1,如何定义,即入口

// Define a local copy of jQuery
var jQuery = function( selector, context ) {
    // The jQuery object is actually just the init constructor 'enhanced'
    return new jQuery.fn.init( selector, context, rootjQuery );//jQuery对象仅仅是构造函数jQuery.prototype.init加强版
}



2,jQuery的原型,及与jQuery.fn.init的关系

//定义对象方法,也即只有通过$("xx").的方式才能调用。

jQuery.fn = jQuery.prototype = {

    init:function( selector, context, rootjQuery ) {

        return jQuery.makeArray( selector, this );

    }

    其他还有很多属性和方法,

    属性有:jquery,constructor, selector, length

    方法有:toArray,get, pushStack,each, ready,slice, first,last,eq, map,end, push, sort, splice

...

}


//把jQuery.prototype赋给jQuery.prototype.init.prototype,是为了后面的实例化

// Give the init function the jQuery prototype for later instantiation
jQuery.fn.init.prototype = jQuery.fn;

也即是,$("xx")拥有了实例方法,可以调用。(调用jQuery.prototype下定义的方法)




为什么jQuery要返回jQuery.fn.init对象?

jQuery = function( selector, context ) {
// The jQuery object is actually just the init constructor 'enhanced'
return new jQuery.fn.init( selector, context, rootjQuery );

}
jQuery.fn = jQuery.prototype = {
    ……
}
jQuery.fn.init.prototype = jQuery.fn;


在 stackoverflow 上找到类似问题:
http://stackoverflow.com/questions/4754560/help-understanding-jquerys-jquery-fn-init-why-is-init-in-fn
还有这个
http://stackoverflow.com/questions/1856890/why-does-jquery-use-new-jquery-fn-init-for-creating-jquery-object-but-i-can/1858537#1858537

I believe the code is written in this fashion so that the new keyword is not required each time you instantiate a new jQuery object and also to delegate the logic behind the object construction to the prototype. The former I believe is to make the library cleaner to use and the latter to keep the initialisation logic cleanly in one place and allow init to be recursively called to construct and return an object that correctly matches the passed arguments.




3,extend扩展对象方法和静态方法原理

jQuery.extend = jQuery.fn.extend = function() {

    var target = arguments[0] || {};

    return target;

}

使用extend就方便了,无非就是$.extend({});和$.fn.extend({});如果你能在看到fn时理解联想到是jQuery.prototype就好了。

再通过this作用域看一下:

$.extend ->this是$-> this.aa()

$.fn.extend->this是$.fn-> this.aa()

附extend实现细节:

使用场景:

1,扩展一些函数

只有一个参数。例如:$.extend({f1:function(){},f2:function(){},f3:function(){}})

2,合并多个对象到第一个对象

(1)浅copy,第一个参数是目标对象。例如

var a = {name:"hello"}

var b = {age:30}

$.extend(a,b);//a={name:"hello",age:30}

(2)深copy,第一个参数是TRUE,第二个参数是目标对象。例如

var a = {name:{job:"it"}};
var b = {name:{age: 30 }};
//$.extend(a,b);
$.extend(true,a,b);
console.log(a);
jQuery.extend = jQuery.fn.extend = function() {
    var options, name, src, copy, copyIsArray, clone,
        target = arguments[0] || {},
        i = 1,
        length = arguments.length,
        deep = false;

    // 是不是深复制  Handle a deep copy situation
    if ( typeof target === "boolean" ) {
        deep = target;
        target = arguments[1] || {};
        // skip the boolean and the target
        i = 2;
    }

    // 不是对象类型  Handle case when target is a string or something (possible in deep copy)
    if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
        target = {};
    }

    // 扩展插件的情况  extend jQuery itself if only one argument is passed
    if ( length === i ) {//$.extend({f1:function(){},f2:function(){},f3:function(){}})
        target = this;//this是$,或是$.fn
        --i;
    }

    for ( ; i < length; i++ ) {//可能有多个对象扩展到第一个对象上
        // Only deal with non-null/undefined values
        if ( (options = arguments[ i ]) != null ) {//options是一个对象
            // Extend the base object
            for ( name in options ) {
                src = target[ name ];  //src是target里已经存在的value(也可能不存在)
                copy = options[ name ];//copy是待合入的一个value

                // 防止循环引用  Prevent never-ending loop
                if ( target === copy ) {//例如:var a={};$.extend(a,{name:a});//可能导致循环引用
                    continue;
                }

                // if是深复制else是浅复制  Recurse if we're merging plain objects or arrays
                if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
                    if ( copyIsArray ) {
                        copyIsArray = false;
                        clone = src && jQuery.isArray(src) ? src : [];

                    } else {
                        clone = src && jQuery.isPlainObject(src) ? src : {};
                    }

                    // 亮了,直至剥离至最深一层非对象类型,而且是逐个。Never move original objects, clone them
                    target[ name ] = jQuery.extend( deep, clone, copy );

                // Don't bring in undefined values
                } else if ( copy !== undefined ) {
                    target[ name ] = copy;//target[ name ] = options[ name ];
                }
            }
        }
    }

    // Return the modified object
    return target;
};


jQuery.extend({...})分析
看一下是如何写的

jQuery.extend({

prop:""

method:function(){}

});

可以看出,这些方法是jQuery的静态属性和方法(也即是工具方法),将来既可以直接提供给用户使用,也可以在内部使用。

具体实现的工具属性和方法有(同时也标注了哪些在内部使用)

jQuery.extend({
        expando  :  生成唯一JQ字符串(内部)
        noConflict()  :  防止冲突
        isReady  :  DOM是否加载完(内部)
        readyWait  :  等待多少文件的计数器(内部)
        holdReady()  :  推迟DOM触发
        ready()  :  准备DOM触发
        isFunction()  :  是否为函数
        isArray()  :  是否为数组
        isWindow()  :  是否为window
        isNumeric()  :  是否为数字
        type()  :  判断数据类型
        isPlainObject()  :  是否为对象自变量
        isEmptyObject()  :  是否为空的对象
        error()  :  抛出异常
        parseHTML()  :  解析节点
        parseJSON()  :  解析JSON
        parseXML()  :  解析XML
        noop()  :  空函数
        globalEval()  :  全局解析JS
        camelCase()  :  转驼峰
        nodeName()  :  是否为指定节点名(内部)
        each()  :  遍历集合
        trim()  :  去前后空格
        makeArray()  :  类数组转真数组
        inArray()  :  数组版indexOf
        merge()  :  合并数组
        grep()  :  过滤新数组
        map()  :  映射新数组
        guid  :  唯一标识符(内部)
        proxy()  :  改this指向
        access()  :  多功能值操作(内部)
        now()  :  当前时间
        swap()  :  CSS交换(内部)
});

jQuery.ready.promise = function(){};  监测DOM的异步操作(内部)

function isArraylike(){}  类似数组的判断(内部)


如果您觉得本文的内容对您的学习有所帮助,您可以微信:
分享到:
评论

相关推荐

    Jquery源码分析 源码

    - **模块化**:jQuery源码采用模块化设计,如核心功能、选择器、遍历、属性操作、事件等都是独立模块,便于维护和扩展。 - **工厂函数**:$(selector)是jQuery的工厂函数,它接受字符串、DOM元素或jQuery对象,...

    jquery api, jquery ui api, jquery源码分析

    1. **选择器(Selectors)**:jQuery 的核心功能之一就是强大的CSS选择器,如 `$("#id")` 选择ID为特定值的元素,`$(".class")` 选择具有特定类的元素,`$("tagname")` 选择所有特定类型的标签。 2. **DOM 操作...

    jQuery多功能搜索框插件下拉菜单选择代码

    本篇文章将深入解析名为"jQuery多功能搜索框插件下拉菜单选择代码"的项目,通过分析压缩包中的文件,揭示其工作原理和实现方式。 首先,项目中包含的主要CSS文件有`bootstrap.min.css`和`jquery.dropdown.css`。`...

    jquery1.43源码分析(核心部分)

    例如,`jQuery` 对象内部有许多私有方法如 `_parseHTML`, `_buildFragment`, `_setMatcher` 等,这些方法用于处理 DOM 操作、选择器匹配等核心功能。 #### 七、插件系统 jQuery 的另一个强大之处在于它的插件系统...

    jQuery源码分析系列.pdf

    ### jQuery源码分析系列知识点概览 #### 一、总体架构与核心概念 - **前言开光**:介绍分析jQuery源码的目的和价值,强调通过深入研究源码,可以学习到先进的设计理念和实践技巧。 - **总体架构**:解析jQuery的...

    jQuery.js执行过程分析

    通过对jQuery.js执行过程的深度分析,我们不仅了解了jQuery如何构建其核心功能,还掌握了其在事件处理、Ajax支持等方面的设计理念和技术细节。这对于我们理解和运用jQuery,以及进行前端开发具有重要的指导意义。...

    jquery1.43源码分析(核心部分)[收集].pdf

    在jQuery 1.4.3版本中,其核心部分主要包括选择器引擎、DOM操作、事件处理和函数封装等关键功能。 首先,jQuery的初始化过程始于`jQuery = (function(){ ... })()`,这是一个立即执行的函数表达式(IIFE),确保了...

    Jquery1.2.6源码分析教程

    **jQuery 1.2.6 源码分析教程** jQuery 是一个广泛使用的 JavaScript 库,因其简洁的语法和强大的功能而备受开发者喜爱。在 jQuery 1.2.6 版本中,虽然它已经相对老旧,但其背后的实现原理和优化策略仍然值得深入...

    jQuery源码详细分析中文注释

    《jQuery源码详细分析中文注释》是一份深入解析jQuery库源码的宝贵资源,它为开发者提供了理解这个广泛使用的JavaScript库内部工作机制的机会。jQuery以其简洁的API和强大的功能深受前端开发者的喜爱,但其背后的...

    jquery 源码分析

    #### 三、jQuery的核心功能 1. **DOM操作**:jQuery提供了丰富的API来操作DOM元素,例如`addClass()`, `removeClass()`, `toggleClass()`等。 2. **事件处理**:通过`on()`, `off()`, `trigger()`等方法轻松绑定和...

    Jquery1.2.6源码分析

    首先,jQuery的核心设计理念是"Write Less, Do More",它通过简洁的API实现了丰富的功能。在1.2.6版本中,jQuery主要由几个关键部分组成:选择器(Selectors)、DOM操作(DOM Manipulation)、事件处理(Events)、...

    分享jquery核心库1.6.2版本的未加密的源代码共8981行.zip

    本篇文章将重点围绕jQuery核心库1.6.2版本进行深入解析,通过对源代码的分析,帮助读者理解其内部机制,并探讨如何在实际项目中有效利用这些知识。 首先,我们来看`jquery-1.6.2.js`这个文件,它是jQuery的核心库。...

    jQuery源码分析(1.7)

    ### jQuery源码分析关键知识点详解 #### 一、前言 在深入了解jQuery源码之前,有必要先简要介绍一下jQuery的基本情况及其对JavaScript编程领域的重要意义。jQuery作为一个轻量级、功能丰富的JavaScript库,在Web...

    jquery多功能插件

    jQuery的核心理念是“Write Less, Do More”。它简化了DOM操作、事件处理、动画制作和Ajax交互。通过使用jQuery,开发者可以以更少的代码完成更多的任务,提高开发效率。 二、jQuery插件机制 jQuery插件是扩展...

    Jquery 源代码分析

    一、jQuery核心概念 1. **选择器引擎(Sizzle)**:jQuery的核心之一是选择器引擎Sizzle,它负责解析CSS选择器并找到匹配的DOM元素。在jQuery 1.2.6中,Sizzle已经非常成熟,能够处理复杂的CSS3选择器,并实现了高...

    JQuery功能测试源码_jquerydemo.zip

    这个压缩包很可能包含了多个示例文件,用于演示jQuery的各种核心功能,如选择器、DOM操作、事件绑定、动画和Ajax请求等。这些示例代码是学习和理解jQuery工作原理的宝贵资源。 1. **选择器**:jQuery的选择器功能是...

    jquery1.2.6源码分析

    通过对选择器、DOM操作、事件处理、AJAX和动画等核心功能的解析,我们能更好地掌握JavaScript编程,提升我们的开发效率。尽管现在的jQuery已经发展到更高级的版本,但对早期版本的学习仍然有价值,因为许多基础设计...

    JQuery源码详细中文注释_Jquery源码分析_

    一、jQuery核心概念 1. 选择器:jQuery的核心之一是它的CSS选择器,如$("#id")、$(".class")等,这些选择器基于Sizzle引擎实现,能够高效地定位DOM元素。 2. 链式调用:jQuery对象返回的是一个包含多个DOM元素的...

    Jquery1.2.6源码分析+源代码

    jQuery 的核心函数 `$` 是整个库的入口点。在 1.2.6 版本中,`$` 是一个立即执行的函数表达式(IIFE),它创建了一个局部作用域,避免了全局变量污染。`$` 函数接受两个参数:一个选择器和一个回调函数。如果选择器...

Global site tag (gtag.js) - Google Analytics