/* version : 1.7.1 * codeName : jQuery * node author : Alfred lee*/

// extend 函数是jQuery 的扩展函数。也是传说中的深度拷贝// 首行把 jQuery.extend jQuery.fn.extend 统一赋值一个函数。jQuery.extend = jQuery.fn.extend = function() {var options, name, src, copy, copyIsArray, clone,        target = arguments[0] || {},        i = 1,        length = arguments.length,        deep = false;

/* options         要扩展到源的某个对象 称为选项 * name         索引名 * src            源的索引记录 * copy         选项的索引记录 * copyIsArray    是不是数组(用来判断如何给原来的对象扩展参见下面的详细分析) * clone         复制体(源有的src的重新定义) * target        源(被扩展的对象) * i             记录数(用来记录从那里是要扩展到源的对象) * length        参数长度 * deep            是否深度拷贝。即取值还是取址不知道和C的 * & 解释类似*/

// 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 ) {        target = this;        --i;    }

for ( ; i < length; i++ ) {// Only deal with non-null/undefined values        // 对有效的内容开始扩展复制 这把逐个参数传给了选择项        if ( (options = arguments[ i ]) != null ) {// Extend the base object            for ( name in options ) {//遍历选择项 把对应索引的源值和 选择值保存对比。                src = target[ name ];//源                copy = options[ name ];//选择项                //如果源就是要拷贝的(循环引用)防止死循环。                //不操作任何直接跳过继续下一个                // Prevent never-ending loop                if ( target === copy ) {continue;                }// 如果是深度的时候 这时候判断了是不是常规对象和要扩展进的是不是数组                // Recurse if we're merging plain objects or arrays                if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {if ( copyIsArray ) {//这里不知道为何重写了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;                }            }        }    }

// Return the modified object    // 返回的就是扩充后的了。也就是经常用来做默认值的方法。    return target;};

转载于:https://www.cnblogs.com/AlfredLee/archive/2012/02/01/jQuery_extend.html

jQuery 1.7.1 代码研究 extend相关推荐

  1. jQuery 原理的模拟代码 -4 重要的扩展函数 extend

    在上两篇文章中,我们看到每次要通过 jQuery 的原型增加共享方法的时候,都需要通过 jQuery.fn 一个个进行扩展,非常麻烦,jQuery.fn.extend 提供了一个扩展机制,可以方便我们 ...

  2. Javascript笔记:(实践篇)从jQuery插件技术说起-分析extend方法的源码(发现extend方法里有bug)(下篇)...

    1.1     分析$.extend源码 在分析源码之前,我还要加一段s测试代码,代码如下: <script type="text/javascript"> $(doc ...

  3. 星级评价的代码php,JavaScript_使用jQuery实现星级评分代码分享,前面有一篇原生js实现星级评 - phpStudy...

    使用jQuery实现星级评分代码分享 前面有一篇原生js实现星级评分 .可能覆盖面不是很广,现在给出一个jquery实现的星级评分. http://s.thsi.cn/js/jquery-1.7.2. ...

  4. jquery订阅发布插件代码草稿,为jquery扩展jquery.publish,jquery.subscribe方法

    jquery订阅发布插件代码草稿! jquery订阅发布插件代码草稿,为jquery扩展jquery.publish,jquery.subscribe方法 --- jquery订阅发布插件代码草稿 & ...

  5. jquery和zepto的扩展方法extend

    jquery和zepto的扩展方法extend 总结下jQuery(3.1.1)和zepto(1.1.6)到底是如何来开放接口,使之可以进行扩展,两者都会有类型判断,本文使用简单的类型判断,暂不考虑兼 ...

  6. 漂亮实用的jQuery倒计时插件特效代码

    原文:漂亮实用的jQuery倒计时插件特效代码 源代码下载地址:http://www.zuidaima.com/share/1799598875675648.htm

  7. 可控制导航下拉方向的jQuery下拉菜单代码

    可控制导航下拉方向的jQuery下拉菜单代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...

  8. JQuery 入门 - 附案例代码

    文章目录 预备知识与后续知识及项目案例 为什么要学jquery 体验jquery的使用 jquery到底是什么 jquery的版本问题 jquery的入口函数 jq对象和dom对象(重要) jquer ...

  9. Web3j监听功能代码研究

    Web3j监听功能代码研究 高洪涛 2021-03-19 本周深入研究了web3j工具包实现以太坊的监听功能,实现了交易监听和代币监听的方法,对监听过程中的常见问题进行了处理,本文就是对这部分开发经验 ...

最新文章

  1. qt中定时器Timer的使用
  2. C++ Priemer目录索引
  3. 5款替代微软Visio的开源免费软件(转)
  4. Eclipse + Gradle实现APK分包
  5. 给MM修电脑的三个步骤
  6. mysql bin 分析_mysql bin log 分析
  7. docker镜像图[更新中]
  8. mysql sqlyog讲解_MySQL与sqlyog安装教程图文详解
  9. 国密算法使用-SM3
  10. Github 插件之 Octotree 报错介绍与解决
  11. 刀具半径补偿 c语言,数控铣床编程时刀具半径补偿指令及运用
  12. 高等数学:第九章 重积分(1)二重积分的概念、计算法和应用
  13. 【算法学习笔记07】贪心算法(Greedy Algorithm)
  14. 坐标系(Coordinate System)
  15. 基木鱼html标签,基木鱼 | QA常见问题|【其他类】
  16. python 开发视频播放网站_python开发微电影视频网站教程附源码
  17. ubuntu下完全卸载 opencv库 详细教程
  18. SpringData JPA 之疑难杂症
  19. C#调用Halcon并输出圆心坐标
  20. arcgis提取四至权利人--最小外接矩形

热门文章

  1. Web框架——Flask系列之蓝图Blueprint(二十一)
  2. jQuery学习笔记系列(一)——入口函数,jQuery对象和DOM对象,jQuery选择器、样式操作、效果(显示隐藏、滑入滑出、淡入淡出、自定义动画、停止动画队列)
  3. LeetCode 439. 三元表达式解析器
  4. LeetCode 490. 迷宫(BFS/DFS)
  5. LeetCode 1234. 替换子串得到平衡字符串(滑动窗口)
  6. LeetCode 95. 不同的二叉搜索树 II(递归)
  7. 程序员面试金典 - 面试题 01.08. 零矩阵
  8. coturn的负载均衡特性_高性能负载均衡
  9. java的常用引用类、数组、String类
  10. Power BI 将商业智能数据转换为数据理解