jquery extend源码解析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jquery extend源码解析相关的知识,希望对你有一定的参考价值。

		$.extend(obj1,0bj2,{"name":"s","age":22})
		//target  要拷贝到哪个对象上
		// i  要执行拷贝的次数
		// length  要拷贝的参数的长度
		// name 对象参数中属性值
		// options 对象参数
		// clone 深度拷贝时重名对象属性的拷贝
		// target 要拓展的对象

		
		jQuery.extend = jQuery.fn.extend = function() {
	    var src, copyIsArray, copy, name, options, clone,
	        target = arguments[0] || {},    // 常见用法 jQuery.extend( obj1, obj2 ),此时,target为arguments[0]
	        i = 1,
	        length = arguments.length,
	        deep = false;

	    // Handle a deep copy situation
	    if ( typeof target === "boolean" ) {    // 如果第一个参数为true,即 jQuery.extend( true, obj1, obj2 ); 的情况
	        deep = target;  // 此时target是true
	        target = arguments[1] || {};    // target改为 obj1
	        // skip the boolean and the target
	        i = 2;
	    }
	    // 以上处理:如果第一个参数是boolean,第二个参数是target。
	    // Handle case when target is a string or something (possible in deep copy)
	    if ( typeof target !== "object" && !jQuery.isFunction(target) ) {  // 如果target不是一个对象,设置默认对象。
	        target = {};
	    }

	    // extend jQuery itself if only one argument is passed
	    if ( length === i ) {   // 处理这种情况 jQuery.extend(obj),或 jQuery.fn.extend( obj )
	        target = this;  // jQuery.extend时,this指的是jQuery;jQuery.fn.extend时,this指的是jQuery.fn
	        --i;
	    }

	    for ( ; i < length; i++ ) {
	        // Only deal with non-null/undefined values
	        if ( (options = arguments[i]) != null ) { // 比如 jQuery.extend( , obj2, obj3, ojb4 ),options则为 obj2、obj3...
	            // Extend the base object
	            for ( name in options ) {
	                src = target[ name ];
	                copy = options[ name ];

	                // Prevent never-ending loop
	                if ( target === copy ) {    // 防止自引用:$.extend(x,{"name1":x});如果  如果target和option[name1]的值一样,会循环迭代。
	                //看网上还有说应该要用src和copy比较的,$.extend({"name1":"张三","age":"14"},{"name1":"李四","age":"14"}),这两个可以进行操作的。
	                    continue;
	                }

	                // Recurse if we‘re merging plain objects or arrays
	                // 如果是深拷贝,且被拷贝的属性值本身是个对象
	                if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
	                    if ( copyIsArray ) {    // 被拷贝的属性值是个数组
	                        copyIsArray = false;
	                        clone = src && jQuery.isArray(src) ? src : [];

	                    } else {    //被拷贝的属性值是个plainObject,比如{ nick: ‘casper‘ }
	                        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 ) {  // 浅拷贝,且属性值不为undefined
	                    target[ name ] = copy;
	                }
	            }
	        }
	    }

	    // Return the modified object
	    return target;



	{
		name1:"sdasd",
		"name2":{
				name1:"sdasd",
				"name2":{
					name1:"sdasd",
					"name2":{
							name1:"sdasd",
							"name2":{
								name1:"sdasd",
								"name2":{
										name1:"sdasd",
										"name2":{
											name1:"sdasd",
											"name2":{
													name1:"sdasd",
													"name2":
													}
												}
										}
									}
							}
						}
				}
	}

  

以上是关于jquery extend源码解析的主要内容,如果未能解决你的问题,请参考以下文章

一.2-extend-用法

一.2-extend-用法

jQuery.extend()方法和jQuery.fn.extend()方法源码分析

jQuery源码架构

[No.8 jQuery源码解析—逐段解析

[No.6 jQuery源码解析—逐段解析