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