美文网首页
面向对象(十)深拷贝和浅拷贝

面向对象(十)深拷贝和浅拷贝

作者: 凸小布 | 来源:发表于2017-02-26 16:18 被阅读12次

    title: 面向对象(十)深拷贝和浅拷贝
    date: # 文章生成时间,一般不改
    categories: # 文章分类目录,可省略
    - 面向对象
    tags: # 文章标签,可省略
    - 面向对象
    - 基于原型面向对象的继承 # 个数不限,单个可直接跟在 tags 后面


    深拷贝

    • 提供一个函数,两个参数(元对象,要拷贝属性的对象)
    • 在函数中先检查第一个参数是否有值,如果没有值那么就初始化一个空的对象
    • for..in循环来遍历参数2,
    • 检查当前的属性值是什么类型
    • 如果是值类型,那么就直接拷贝赋值
    • 如果是引用类型,那么就再调用一次这个方法,去内部拷贝这个对象的所有属性
    <script  >
        var obj = {
            name:"小花脸",
            car:{
                type:"客车",
            },
            friends:["1","2","3"]
        };
    
        //判断某个对象是否是一个数组(Array.isArray())
        //兼容性问题:ES5
        //先判断是isArray方法是否存在,如果不存在那么就自己为Array创建一个isArray方法
        if(typeof Array.isArray != "function") {
            Array.isArray = function(obj){
                return Object.prototype.toString.call(obj) == "[object Array]";
            }
        }
    
        var o = {};
        //deepCopy(o,obj);
        function deepCopy(obj1,obj2) {
            obj1 = obj1 || {};
            for (var i in obj2)
            {
                if (obj2.hasOwnProperty(i))
                {
                    if( typeof obj2[i] == "object")
                    {
                        //判断是数组还是对象
                        obj1[i] = Array.isArray(obj2[i])?[]:{};
                        //引用类型
                        deepCopy(obj1[i],obj2[i]);   //函数调用
                    }else
                    {
                        //值类型
                        obj1[i] = obj2[i];
                    }
                }
            }
        }
    
        deepCopy(o,obj);
        console.log(o);
    
        //共享问题
        //o.car.type = "小货车";
        console.log(obj);
    </script>
    

    相关文章

      网友评论

          本文标题:面向对象(十)深拷贝和浅拷贝

          本文链接:https://www.haomeiwen.com/subject/ceiowttx.html