之前一直比较习惯用Ext.apply()方法来实现对象的克隆,今天遇到一个问题,当对象中含有数组,且数组中包含复杂类型时,Ext.apply()的克隆就有问题了。
于是就想着试试自己能不能解决。在网上查了一会儿,发现如下代码:
function clone(myObj){ if(typeof(myObj) != 'object') return myObj; if(myObj == null) return myObj; var myNewObj = new Object(); for(var i in myObj) myNewObj[i] = clone(myObj[i]); return myNewObj; }
将其加进项目试了一下,发现基本实现了我想要的结果。但是有一个问题,当对象内部有数组成员的地方变成了Object类型,而且它的内置方法如“indexof”也被复制成了一遍,意思就是每一个内置方法都有两个同名方法。我想它的主要原因还是没有对Array类型做特殊处理。
于是经过自己理解进行修改,完全实现了我想要的结果。代码如下:
1 function Clone(myObj) { 2 /// <summary> 3 /// 对象复制 4 /// </summary> 5 /// <param name="myObj"></param> 6 /// <returns type=""></returns> 7 if (myObj === null || myObj === undefined || typeof (myObj) != 'object') 8 return myObj;//五种简单类型复制 9 if (myObj.constructor === Array) {//数组复制 10 if (myObj.length === 0) return myObj; 11 else 12 var myNewArr = []; 13 for (var i = 0; i < myObj.length; i++) { 14 myNewArr.push(Clone(myObj[i])); 15 } 16 return myNewArr; 17 } 18 //其他对象复制 19 var myNewObj = new Object(); 20 for (var i in myObj) { 21 myNewObj[i] = Clone(myObj[i]); 22 } 23 return myNewObj; 24 }