jQuery.extend()源码解读

 

 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

posted @ 2015-08-18 16:19  Cleam  阅读(157)  评论(0)    收藏  举报