jQuery.extend()源码解读

it2022-05-05  130

 

1 // extend方法为jQuery对象和init对象的prototype扩展方法 2 // 同时具有独立的扩展普通对象的功能 3 jQuery.extend = jQuery.fn.extend = function() { 4   /* 5   *target被扩展的对象 6   *length参数的数量 7   *deep是否深度操作 8   */ 9   var options, name, src, copy, copyIsArray, clone, 10     target = arguments[0] || {}, 11     i = 1, 12     length = arguments.length, 13     deep = false; 14 15   // target为第一个参数,如果第一个参数是Boolean类型的值,则把target赋值给deep 16   // deep表示是否进行深层面的复制,当为true时,进行深度复制,否则只进行第一层扩展 17   // 然后把第二个参数赋值给target 18   if ( typeof target === "boolean" ) { 19     deep = target; 20     target = arguments[1] || {}; 21 22     // 将i赋值为2,跳过前两个参数 23     i = 2; 24   } 25 26   // target既不是对象也不是函数则把target设置为空对象。 27   if ( typeof target !== "object" && !jQuery.isFunction(target) ) { 28     target = {}; 29   } 30 31   // 如果只有一个参数,则把jQuery对象赋值给target,即扩展到jQuery对象上 32   if ( length === i ) { 33     target = this; 34 35     // i减1,指向被扩展对象 36     --i; 37   } 38 39   // 开始遍历需要被扩展到target上的参数 40 41   for ( ; i < length; i++ ) { 42     // 处理第i个被扩展的对象,即除去deep和target之外的对象 43     if ( (options = arguments[ i ]) != null ) { 44       // 遍历第i个对象的所有可遍历的属性 45       for ( name in options ) { 46         // 根据被扩展对象的键获得目标对象相应值,并赋值给src 47         src = target[ name ]; 48         // 得到被扩展对象的值 49         copy = options[ name ]; 50 51         // 这里为什么是比较target和copy?不应该是比较src和copy吗? 52         if ( target === copy ) { 53           continue; 54         } 55 56         // 当用户想要深度操作时,递归合并 57         // copy是纯对象或者是数组 58         if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { 59           // 如果是数组 60           if ( copyIsArray ) { 61             // 将copyIsArray重新设置为false,为下次遍历做准备。 62             copyIsArray = false; 63             // 判断被扩展的对象中src是不是数组 64             clone = src && jQuery.isArray(src) ? src : []; 65           } else { 66             // 判断被扩展的对象中src是不是纯对象 67             clone = src && jQuery.isPlainObject(src) ? src : {}; 68           } 69 70           // 递归调用extend方法,继续进行深度遍历 71           target[ name ] = jQuery.extend( deep, clone, copy ); 72 73         // 如果不需要深度复制,则直接把copy(第i个被扩展对象中被遍历的那个键的值) 74         } else if ( copy !== undefined ) { 75           target[ name ] = copy; 76         } 77       } 78     } 79   } 80 81   // 原对象被改变,因此如果不想改变原对象,target可传入{} 82   return target; 83 };

转自:http://www.cnblogs.com/charling/p/3452677.html

转载于:https://www.cnblogs.com/cleam/p/4739578.html


最新回复(0)