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

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
    } 
}

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

原文地址:https://www.cnblogs.com/sowhite/p/6551577.html