zoukankan      html  css  js  c++  java
  • JS 深度clone

    以前就有看到过如何深度克隆一个对象,好久没写过面向对象的js了,都是在面向过程。。今天花了点时间理解如何使用原生js来实现深度克隆一个对象。
    网上找了一些资料看,下面部分是转载过来的,部分是加上自己的理解和解释,以便以后忘记了。
    不过还是有一些细节的地方没有清楚理解。。哪位大大可以帮忙指点一下就最好了

    <SCRIPT language="JavaScript" type="text/JavaScript">
    Object.prototype.Clone = function(){
        var objClone;
        if (this.constructor == Object){
            objClone = new this.constructor(); 
        }else{
            objClone = new this.constructor(this.valueOf()); 
        }
        for(var key in this){
            if ( objClone[key] != this[key] ){ 
                if ( typeof(this[key]) == 'object' ){ 
                    objClone[key] = this[key].Clone();
                }else{
                    objClone[key] = this[key];
                }
            }
        }
        objClone.toString = this.toString;
        objClone.valueOf = this.valueOf;
        return objClone; 
    } 
    
    
    //调用测试方法
    function printMessage() {
    
    function Person(name,age,gender) {
    this.name=name;
    this.age=age;
    this.gender=gender;
    this.friends={fisrt:'jerry',second:'franck',third:'jack'};
    this.clickMe=function() {
    alert('If you click me, I\'ll say: i\'m '+this.name+', Thank you!');
    }
    }
    
    var p = new Person('xiaozhang','29','man');
    var pAfterClone = p.Clone();
    alert(p.name+"------"+pAfterClone.name);
    alert(p.friends.second+"------"+pAfterClone.friends.second);
    pAfterClone.friends.second= 'james';
    alert(p.friends.second+"------"+pAfterClone.friends.second);
    
    
    }
    
    </SCRIPT>
    

      此外,还有一种对象克隆方法,比较简单,不过不能克隆下原对象的构造函数,所以并没有明确记录下来克隆后的对象是属于何种类型。代码如下:

    function clone(oldObj){
         if(typeof oldObj != "object") return oldObj;
         if(oldObj == null) return olcObj;
         var newObj=new Object();
         for(var i in oldObj){
               newObj[i] = clone(oldObj[i]);
         }   
         return newObj;
    }
  • 相关阅读:
    UOJ #276. 【清华集训2016】汽水
    Luogu P4585 [FJOI2015]火星商店问题
    Luogu P5416 [CTSC2016]时空旅行
    NOIP 2011 提高组初赛错题简析
    Luogu P4068 [SDOI2016]数字配对
    UOJ Easy Round #5
    Codechef September Challenge 2019 Division 2
    Project Euler Problem 675
    AtCoder Grand Contest 037
    拿2k的前端开发都会做些什么?
  • 原文地址:https://www.cnblogs.com/cfhome/p/2816408.html
Copyright © 2011-2022 走看看