a、jQuery.extend( source )
b、jQuery.extend(destination, source1, source2, source3 ....)

c、jQuery.extend(boolean, destination, source1, source2, source3 ....)

  以上是jquery的extend实现方法

首先是第一种:传入一个源函数,拓展自己

 var Test = function(){};
Test.prototype.extend = function(source){
for(var key in source){
this[key] = source[key]
}
return this;
}
var Myobj = {
name:'qiaoming'
}
var test = new Test();
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 === ){
destination = this;
source = arguments[];
extend(destination,source)
return destination;
}
if(arguments.length > ){
var len = arguments.length;
destination = arguments[];
source = [].splice.call(arguments,,len); for(var i=,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]
}
}
}

根据参数数量,选择拓展方法

第三种根据第一个参数是否为布尔值,判断是否进行深拷贝

jquery源码学习(四)—— jquery.extend()-LMLPHP

根据第一个参数是否为布尔值进行判断

    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 === ){
destination = this;
source = arguments[];
extend(destination,source)
}
if(arguments.length > ){
var len,destination,source;
if( arguments[] === true ){
len= arguments.length;
destination = arguments[];
source = [].splice.call(arguments,,len);
for(var i=,l=source.length;i<l;i++){
var s = source[i];
extend(destination,s,true)
}
}else{
var len = arguments.length;
destination = arguments[];
source = [].splice.call(arguments,,len);
for(var i=,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
}
}

这样我们就可以实现一个对象的深浅拷贝

05-11 17:34