a、jQuery.extend( source )
b、jQuery.extend(destination, source1, source2, source3 ....) c、jQuery.extend(boolean, destination, source1, source2, source3 ....)
以上是jquery的extend实现方法
首先是第一种:传入一个源函数,拓展自己
1 var Test = function(){}; 2 Test.prototype.extend = function(source){ 3 for(var key in source){ 4 this[key] = source[key] 5 } 6 return this; 7 } 8 var Myobj = { 9 name:'qiaoming' 10 } 11 var test = new Test(); 12 console.log(test.extend(Myobj))
然后是第二种:传入一个源函数,拓展目标对象
function extend(d,s){ for(var key in s){ d[key] = s[key] } }
首先写一个拓展对象的方法
Test.prototype.extend = function(){ var source , destination if(arguments.length === 1){ destination = this; source = arguments[0]; extend(destination,source) return destination; } if(arguments.length > 1){ var len = arguments.length; destination = arguments[0]; source = [].splice.call(arguments,1,len); for(var i=0,l=source.length;i<l;i++){ var s = source[i]; extend(destination,s) } return destination; } function extend(d,s){ for(var key in s){ d[key] = s[key] } } }
根据参数数量,选择拓展方法
第三种根据第一个参数是否为布尔值,判断是否进行深拷贝
根据第一个参数是否为布尔值进行判断
function extend(d,s,b){ var d = d; if(b && b===true){ for(var key in s){ var v = s[key]; // 假如v还是object if(v instanceof Array){ d[key] = extend(d[key] || [] , v , true); }else if(v instanceof Object){ d[key] = extend(d[key] || {} , v , true); }else{ d[key] = v; } } }else{ for(var key in s){ var v = s[key]; d[key] = v; } } return d }
重构extend,拥有第三个参数如果为true就深拷贝
最后的代码如下
Test.prototype.extend = function(){ var source , destination if(arguments.length === 1){ destination = this; source = arguments[0]; extend(destination,source) } if(arguments.length > 1){ var len,destination,source; if( arguments[0] === true ){ len= arguments.length; destination = arguments[1]; source = [].splice.call(arguments,2,len); for(var i=0,l=source.length;i<l;i++){ var s = source[i]; extend(destination,s,true) } }else{ var len = arguments.length; destination = arguments[0]; source = [].splice.call(arguments,1,len); for(var i=0,l=source.length;i<l;i++){ var s = source[i]; extend(destination,s) } } return destination; } function extend(d,s,b){ var d = d; if(b && b===true){ for(var key in s){ var v = s[key]; // 假如v还是object if(v instanceof Array){ d[key] = extend(d[key] || [] , v , true); }else if(v instanceof Object){ d[key] = extend(d[key] || {} , v , true); }else{ d[key] = v; } } }else{ for(var key in s){ var v = s[key]; d[key] = v; } } return d } }
这样我们就可以实现一个对象的深浅拷贝