• 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":
    													}
    												}
    										}
    									}
    							}
    						}
    				}
    	}
    

      

  • 相关阅读:
    设计模式系列之-抽象工厂
    设计模式系列之-工厂方法
    设计模式系列之-简单工厂
    键盘事件keydown、keypress、keyup随笔整理总结(摘抄)
    js 方法重载
    JS禁止右键
    jquery.validate运用和扩展
    Javascript Math.ceil()与Math.round()与Math.floor()区别
    Jquery操作下拉框(DropDownList)实现取值赋值
    jquery中attr和prop的区别
  • 原文地址:https://www.cnblogs.com/siwy/p/5933514.html
Copyright © 2020-2023  润新知