码迷,mamicode.com
首页 > 其他好文 > 详细

深度克隆对象

时间:2015-05-11 14:46:13      阅读:97      评论:0      收藏:0      [点我收藏+]

标签:克隆   前端   

有时,我们需要对一个对象进行复制,如下列要求:
1. 使用递归来实现一个深度克隆,可以复制一个目标对象,返回一个完整拷贝
2. 被复制的对象类型会被限制为数字、字符串、布尔、日期、数组、Object对象。

<script>
    function isObject(obj){
        if(Object.prototype.toString.call(obj)===‘[object Array]‘ || Object.prototype.toString.call(obj)===‘[object Object]‘)
            return true;
        else
            return false;           
    }
    function cloneObject(obj){
        var cloneObj;
        cloneObj=(obj instanceof Array) ? []:{}; //判断对象类型,新建克隆对象
        for(var i in obj){
            if(obj.hasOwnProperty(i)){
                cloneObj[i]=isObject(obj[i]) ? cloneObject(obj[i]):obj[i];
            }
        }
        return cloneObj;
    }


</script>

在题目中,object对象包含两种,一个是数组Array,另一个是{}
obj instanceof Array 通过判断来新建克隆对象属于哪一种


对于简单数组,我们会遇到这种情况

var ary=[1,2,3,4];
var ary1=ary;
ary[0]=8;
console.log(ary[0]);//结果为8
console.log(ary1[1]);//结果为8

为什么会出现这种情况呢?
数组是引用类型数据,在数组之间进行赋值时,没有为新的数组另外开辟内存空间,而是将新数组变量的引用地址指向了原来的数组,所以当原来数组发生变化时,新数组也会产生同样变化。
这不是我们想要的结果,那我们就需要考虑数组克隆了。
下面我们就为数组Array原型添加一个数组克隆的方法
实现数组克隆的方式很多,简单列举几种:

1. 我们最容易想到的一种方式

Array.prototype.clone=function(){ 
    var a=[]; 
    for(var i=0,l=this.length;i<l;i++) 
        a.push(this[i]); 
    return a; 
} 

2. 通过Array对象的slice方法

slice方法是通过参数start和end的传入值来返回数组中的一段,该方法不对原数组进行操作。我们通过slice(0)可以使其返回所有项。

Array.prototype.clone=function(){ 
    return this.slice(0); 
} 

3. 通过Array对象的concat方法

concat方法是用来实现数组的合并的。通过和一个空函数的合并,即可实现我们的克隆功能。

Array.prototype.clone=function(){ 
    return [].concat(this);
} 
//或者 
Array.prototype.clone=function(){ 
    return this.concat(); 
} 

深度克隆对象

标签:克隆   前端   

原文地址:http://blog.csdn.net/u012193330/article/details/45643869

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!