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