zoukankan      html  css  js  c++  java
  • 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
        } 
    }

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

  • 相关阅读:
    虚函数
    class与struct的区别
    HTTP是什么连接
    长连接与短连接
    多线程的主要优点
    overload、override、overwrite的介绍
    常用的Linux命令
    IO模型——IO多路复用机制
    栈区与堆区的区别
    软链接和硬链接到底有啥区别
  • 原文地址:https://www.cnblogs.com/sowhite/p/6551577.html
Copyright © 2011-2022 走看看