jQuery.extend
时间:2010-11-22 来源:popingcandy
jQuery.extend([deep],target,[object1],[objectN]) version:1.1.4
---------------------------------------------------------------------
deep if true,the merge becomes recursive(递归)(aka.deep copy).
target the object to extend, it will receive the new properties.
object1 an object containing additional properties to merge in.
objectN additional objects containing properties to merge in.
----------------------------------------------------------------------
使用说明
jQuery.extend与jQuery.fn.extend指向同一个函数对象
jQuery.extend是jQuery的属性函数(静态方法)
jQuery.fn.extend是jQuery函数所构造对象的属性方法(对象方法)
1 $.extend({object},{object}) $.extend(boolean,{object},{object})
2 $.extend({object})为jquery对象本身增加方法
3 $.fn.extend({object})原型继承为jquery.fn对象增加方法
-----------------------------------------------------------------------
源码分析
jQuery.extend=jQuery.fn.extend=function(){
//定义初始化一些要用到的变量。
var options,name,src,copy,copyIsArray,clone, target=arguments[0]||{}, i=1, length=arguments.length, deep=false; //处理深度复制,取第二个参数为目标对象 if(typeof target ==="boolean"){ deep=target; target=arguments[1]||{}; i=2; } //当target是除object和function的其他类型时(string,number,undefined,boolean) if(typeof target !=="object"&&!jQuery.isFunction(target)){ target={};//target赋值为空对象 } //匹配$.extend({object}),$.extend(boolean,{object})两种情况,扩展this if(length === i){ target=this; --i; } //此处从第一个参数对象开始循环,判断参数对象的属性值copy是否为数组或对象,若是则递归进行深度复制。如果为基本类型或者函数,判断copy是否为undefined,否则直接复制。 for(;i<length;i++){ if((options = arguments[i]) != null){//当参数不为null时 //遍历参数对象的属性 for(name in options){ src=target[name];//目标对象中该属性值 copy=options[name];//参数对象中该属性值 //存在目标对象本身的引用,构成死循环,结束本次遍历 if(target === copy){ continue; } //如果需要深度复制,并且copy存在为数组或空对象 if(deep&©&&(jQuery.isPlainObject(copy)||(copyIsArray=jQuery. isArray(copy))){ if(copyIsArray){//如果copy是数组 copyIsArray=false;//重新置否 clone=src&&jQuery.isArray(src)?src:[];//src为数组 }else{ clone=src&&jQuery.isPlainObject(src)?src:{};//src为对象 } //递归进行深度复制 target[name]=jQuery.extend(deep,clone,copy); }else if(copy!== undefined){//对于undefined的值不进行扩展 target[name]=copy; } } } } return target;//返回扩展好的对象 }; ---------------------------------------------------------------------------------- $.extend(true, { name: 'John', location: { city: 'Boston' } }, { last: 'Resig', location: { state: 'MA' } } ); //设置deep为true,则{name: 'John',last: 'Resig',location:{city: 'Boston' ,state: 'MA'}} $.extend( { name: 'John', location: { city: 'Boston' } }, { last: 'Resig', location: { state: 'MA' } } ); //{name: 'John',last: 'Resig',location:{state: 'MA'}} $.extend( function hello(){alert("hello"); });//结果为jquery对象 $.extend();//空对象
var options,name,src,copy,copyIsArray,clone, target=arguments[0]||{}, i=1, length=arguments.length, deep=false; //处理深度复制,取第二个参数为目标对象 if(typeof target ==="boolean"){ deep=target; target=arguments[1]||{}; i=2; } //当target是除object和function的其他类型时(string,number,undefined,boolean) if(typeof target !=="object"&&!jQuery.isFunction(target)){ target={};//target赋值为空对象 } //匹配$.extend({object}),$.extend(boolean,{object})两种情况,扩展this if(length === i){ target=this; --i; } //此处从第一个参数对象开始循环,判断参数对象的属性值copy是否为数组或对象,若是则递归进行深度复制。如果为基本类型或者函数,判断copy是否为undefined,否则直接复制。 for(;i<length;i++){ if((options = arguments[i]) != null){//当参数不为null时 //遍历参数对象的属性 for(name in options){ src=target[name];//目标对象中该属性值 copy=options[name];//参数对象中该属性值 //存在目标对象本身的引用,构成死循环,结束本次遍历 if(target === copy){ continue; } //如果需要深度复制,并且copy存在为数组或空对象 if(deep&©&&(jQuery.isPlainObject(copy)||(copyIsArray=jQuery. isArray(copy))){ if(copyIsArray){//如果copy是数组 copyIsArray=false;//重新置否 clone=src&&jQuery.isArray(src)?src:[];//src为数组 }else{ clone=src&&jQuery.isPlainObject(src)?src:{};//src为对象 } //递归进行深度复制 target[name]=jQuery.extend(deep,clone,copy); }else if(copy!== undefined){//对于undefined的值不进行扩展 target[name]=copy; } } } } return target;//返回扩展好的对象 }; ---------------------------------------------------------------------------------- $.extend(true, { name: 'John', location: { city: 'Boston' } }, { last: 'Resig', location: { state: 'MA' } } ); //设置deep为true,则{name: 'John',last: 'Resig',location:{city: 'Boston' ,state: 'MA'}} $.extend( { name: 'John', location: { city: 'Boston' } }, { last: 'Resig', location: { state: 'MA' } } ); //{name: 'John',last: 'Resig',location:{state: 'MA'}} $.extend( function hello(){alert("hello"); });//结果为jquery对象 $.extend();//空对象
相关阅读 更多 +