`
zccst
  • 浏览: 3293699 次
  • 性别: 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的发展之迅速和取得的成功之巨大是其他所有开发框架都难以企及的,它已经成为Web开发者必备的核心技能之一。如果你尚未掌握jQuery或功力还不够,推荐你认真阅读这本书并付诸实践,与同类的jQuery图书相比,它...

    jQuery源码分析系列

    jQuery作为Javascript集大成的库,对于其实现原理和核心功能的实现,对码农们来说还是有很多值得学习和借鉴,资源来自于网络

    谈一谈jQuery核心架构设计

    从核心功能来看,jQuery仅仅做了一件简单而又平凡的事:查询。它的语法如此简洁明了,以致于很多人在不知道javascript是什么的时候就已经会用jQuery了,用一个词形容就是:大道至简。 从设计层面来看,我们可以将...

    jQuery中的jQuery()方法用法分析

    jQuery的核心功能都是通过此方法实现的,或者说以某种方式使用此方法实现。下面就详细介绍一下次方法的用法。 语法结构一: 当jQuery()方法没有任何参数的时候,会返回一个空jQuery对象。 代码如下:jQuery() 实例...

    24小时订单分析(JQuery框架+EasyUI框架+layDate)

    这个24小时订单分析和公司做的项目很贴近,如果有兴趣的可以下载看一下,真的很有帮助,EasyUI框架也是当下用的还算多的一个前端框架,有兴趣的可以先找我要效果图,先看看是否有必要。jQuery 最大的优势,就是特别...

    jQuery 源码分析笔记

    jQuery的宗旨是Write Less, Do More。它对JavaScript的开发风格侵入...除了居于核心的一小部分代码之外,剩下的jQuery都是松散的函数,扩展性很强。http://plugins.jquery.com上有成千上万的jQuery插件,你需要的功能几

    jQuery实现的移动端图片缩放功能组件示例

    主要介绍了jQuery实现的移动端图片缩放功能组件,结合实例形式详细分析了jQuery基于移动端的图片缩放功能组件实现原理、步骤、核心代码及使用技巧,需要的朋友可以参考下

    利用jquery实现瀑布流3种案例

    一、瀑布流是我们常见的案例,这里主要讲述,用jquery的方式实现瀑布流的功能! 引言:我们经常见到很多网站的瀑布流功能,如淘宝、京东这些商品等等.. 实现它我们首先考虑几个问题:1、获取到数据 2、排列的方式 3...

    jQuery网页定位导航特效实现方法

    主要介绍了jQuery网页定位导航特效实现方法,结合实例形式分析了jQuery网页定位导航的功能描述、原理与核心实现代码,需要的朋友可以参考下

    仿百度、Google的suggest特效功能,源码分析

    这也是一个整合hibernate与struts连接数据库的项目,利用jQuery实现界面布局,ajax发送请求,即获取数据,轻巧的jQuery只用了仅仅30行代码就完成模仿百度或Google的suggest的模块功能,而且还附加了双击事件和回车...

    基于 jQuery 的 Web 源程序在线评测系统的设计与实现

    动编译、测试、分析及评判的系统。 该系统最初是为了支持 ACM/ICPC(ACM International Collegiate Programming Contest,国际大学生程序设计竞赛)而开发的系统。在实际应用中取得了非常好的 效果,近年来有很多...

    JavaScript的概要介绍与分析

    JavaScript是一种流行的、...这些库和框架可以帮助开发者更加高效地实现各种功能,如React、Angular和Vue等前端框架,以及jQuery、Axios等实用库。这些资源不仅提供了丰富的API和文档,还有大量的教程和示例代码,方

    唯我倾城网上购物商城设计与实现.doc

    3.3 系统功能模块设计 (7) 3.4购物流程图 (8) 4 数据库设计 4.1 数据库概念结构设计 (9) 4.2 数据库逻辑结构设计 (11) 4.3 存储过程 (19) 5 系统的详细设计 5.1 公共类的设计 (21) 5.2 加密算法的设计 ...

    电影售票网站-Java

    自己大三做的售票网站,技术上还是用当时的主流,前端页面大约有10页, 比较核心的功能是,电影选择购票,根据IP自动分析所在地和所在地电影院。电影详细情况,电影选座(这个前端看起来高端一点),订单提交,...

    基于ASP.NET三层架构技术的HR人力资源管理系统项目

    同时会涉及到jQuery Ajax、XML、jQuery插件 、Dtree递归树\WebChart高级图表统计图\Excel导出复杂报表打印\CodeSmith\图片水印\防盗链\WebService\面向对象的建模、分析、设计和实施方法,掌握第三方控件技术和报表...

    基于ssm高校四六级报名管理系统(源码+部署说明+系统介绍).zip

    具体来说,系统的核心功能如下: 1、考生信息管理:支持考生的基本信息录入、添加、查询等操作,包括学生的姓名、学号、性别等。 2、考试报名:系统支持四六级考试报名的检测,提供报名表填写、考位选择、支付方式...

    JavaEE求职简历-姓名-JAVA开发工程师.doc

    核心功能:用户管理、部门管理、薪资管理、职位管理、员工管理、公告管理、统计管理、下载中心、员工打卡等模块,平台用户角色可自由定制。 责任描述:(1)参与项目需求分析,模块的划分,开发环境的搭建,数据库表的...

    这是一个SSM(Spring+SpringMVC+Mybatis)+jQuery EasyUI开发的ERP系统。.zip

    计算机硬件系统: 计算机硬件系统是构成计算机物理实体的所有部件的集合,包括核心组件以及外设。其主要组成部分包括: 中央处理单元 (CPU):作为计算机的大脑,负责执行指令、进行逻辑运算和数据处理。 内存:...

    傲.NET代码生成器 1.2.4

    能实现对ACCESS,mysql,SQLSERVER2000,ORACLE等多种数据库进行操作,提供了 SQL查询分析器,存储过程生成器,数据脚本生成器,数据文档生成器等多个子功能模块。并根据库和表自动生成基类代码,包括生成属性、添加、...

Global site tag (gtag.js) - Google Analytics