jQuery.extend()源码解读
// extend方法为jQuery对象和init对象的prototype扩展方法
// 同时具有独立的扩展普通对象的功能
jQuery.extend = jQuery.fn.extend = function() {
  /*
  *target被扩展的对象
  *length参数的数量
  *deep是否深度操作
  */
  var options, name, src, copy, copyIsArray, clone,
    target = arguments[0] || {},
    i = 1,
    length = arguments.length,
    deep = false;
  // target为第一个参数,如果第一个参数是Boolean类型的值,则把target赋值给deep
  // deep表示是否进行深层面的复制,当为true时,进行深度复制,否则只进行第一层扩展
  // 然后把第二个参数赋值给target
  if ( typeof target === "boolean" ) {
    deep = target;
    target = arguments[1] || {};
    // 将i赋值为2,跳过前两个参数
    i = 2;
  }
  // target既不是对象也不是函数则把target设置为空对象。
  if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
    target = {};
  }
  // 如果只有一个参数,则把jQuery对象赋值给target,即扩展到jQuery对象上
  if ( length === i ) {
    target = this;
    // i减1,指向被扩展对象
    --i;
  }
// 开始遍历需要被扩展到target上的参数
  for ( ; i < length; i++ ) {
    // 处理第i个被扩展的对象,即除去deep和target之外的对象
    if ( (options = arguments[ i ]) != null ) {
      // 遍历第i个对象的所有可遍历的属性
      for ( name in options ) {
        // 根据被扩展对象的键获得目标对象相应值,并赋值给src
        src = target[ name ];
        // 得到被扩展对象的值
        copy = options[ name ];
        // 这里为什么是比较target和copy?不应该是比较src和copy吗?
        if ( target === copy ) {
          continue;
        }
        // 当用户想要深度操作时,递归合并
        // copy是纯对象或者是数组
        if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
          // 如果是数组
          if ( copyIsArray ) {
            // 将copyIsArray重新设置为false,为下次遍历做准备。
            copyIsArray = false;
            // 判断被扩展的对象中src是不是数组
            clone = src && jQuery.isArray(src) ? src : [];
          } else { 
            // 判断被扩展的对象中src是不是纯对象
            clone = src && jQuery.isPlainObject(src) ? src : {};
          }
          // 递归调用extend方法,继续进行深度遍历
          target[ name ] = jQuery.extend( deep, clone, copy );
        // 如果不需要深度复制,则直接把copy(第i个被扩展对象中被遍历的那个键的值)
        } else if ( copy !== undefined ) {
          target[ name ] = copy;
        }
      }
    }
  }
  // 原对象被改变,因此如果不想改变原对象,target可传入{}
  return target;
};
jQuery.extend()源码解读的更多相关文章
- jQuery.Callbacks 源码解读二
		
一.参数标记 /* * once: 确保回调列表仅只fire一次 * unique: 在执行add操作中,确保回调列表中不存在重复的回调 * stopOnFalse: 当执行回调返回值为false,则 ...
 - jQuery.extend源码深层分析
		
在网站的开发中,经常会自己写一些jQuery插件来方便使用,其中自然少不了一个关键的方法->jQuery.extend(),使用这个方法来扩展jQuery对象. 那么今天就来讲讲这个函数的实现原 ...
 - jQuery toggleClass 源码解读
		
toggleClass: function( value, stateVal ) { var type = typeof value;//值类型 if ( typeof stateVal === &q ...
 - jQuery attr() 源码解读
		
我们知道,$().attr()实质上是内部调用了jQuery.access方法,在调用时jQuery.attr作为回调传入.在通过种种判断(参看jQuery.access()方法)之后,取值和赋值最后 ...
 - jquery extend源码解析
		
$.extend(obj1,0bj2,{"name":"s","age":22}) //target 要拷贝到哪个对象上 // i 要执行拷 ...
 - jquery.fileupload源码解读笔记
		
基础编程风格 新建 test.html 和 test.js和 main.js和 无论哪种顺序 <body> <script src="/Sandeep/js/jquery ...
 - jQuery框架源码解读
		
1.jQuery 1.9.1 parseJSON: function( data ) { // Attempt to parse using the native JSON parser first ...
 - jQuery position() 源码解读
		
position的代码比较简单... position: function() { if ( !this[ 0 ] ) { return; } var offsetParent, offset, el ...
 - jquery offsetParent()源码解读
		
offsetParent: function() { return this.map(function() { var offsetParent = this.offsetParent || docE ...
 
随机推荐
- leetcode:pascal's_triangle_II
			
一. 称号 一行值. 二. 分析 这道题跟Pascal'sTriangle非常类似,仅仅是这里仅仅须要求出某一行的结果.Pascal's Triangle中由于是求出所有结果,所以我们 ...
 - android采用videoView播放视频(包装)
			
//android播放视频.用法:于androidManifest.xml添加activity, // <activity android:name=".PlayVideo" ...
 - 第十二章——SQLServer统计信息(3)——发现过期统计信息并处理
			
原文:第十二章--SQLServer统计信息(3)--发现过期统计信息并处理 前言: 统计信息是关于谓词中的数据分布的主要信息源,如果不知道具体的数据分布,优化器不能获得预估的数据集,从而不能统计需要 ...
 - 看你的门-攻击服务器(4)-HTTP参数注入攻击
			
首先需要声明.这纯粹是没有远见和有点真才实学开发一个愚蠢的观点,只为web参考系统安全. 1.HTTP参数注入攻击 參数,被用做后端HTTP请求中的參数,这个时候就有可能会导致HTTP參数注入. 一个 ...
 - IT该忍者神龟Jquery小工具easyUI物业摘要召回
			
找了个时间看了下EasyUI插件.对它的插件感觉是非常舒服,特地把Easy UI的大部分功能属性做了一下汇总. 此属性列表请对比jQuery EasyUI 1.0.5,关于它的很多其它资讯请猛击这里. ...
 - Visual Studio Team Services使用教程--Readers tfs组成员添加
 - C++ Primer笔记4_静态成员类_IO库
			
1.静态成员类 static成员变量与函数 static成员变量:必须在类外初始化.(const或引用类型变量必须在构造函数初始化列表里初始化) static成员函数: 不依赖于类.相当于类里的全局函 ...
 - vs2015管理github代码
 - Android适配方案小结(一)
			
相关计量单位介绍: px:是屏幕的像素点,不同设备显示的效果一样. in:英寸(1英寸等于2.54cm) mm:毫米 pt:磅, 1/72英寸 dp:device independent pixels ...
 - hdu4770:Lights Against Dudely(回溯 + 修剪)
			
称号:hdu4770:Lights Against Dudely 题目大意:相同是n*m的矩阵代表room,房间相同也有脆弱和牢固之分,如今要求要保护脆弱的房间.须要将每一个脆弱的房间都照亮,可是牢固 ...