實作Clone最關鍵的就是要建立一個和原對象類型相同的對象,不然還叫什麼Clone呢?然後再把原對象裡的值Copy到目标對象,如果遇到值本身是對象的,還需要繼續遞歸建立和複制資料。
JScript對象執行個體的Clone方法代碼如下:
<script language="javascript">
Object.prototype.Clone = function()
{
var objClone = new this.constructor();
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];
}
}
if ( !objClone || ('' + objClone) == '' )
return (new String(this) + objClone) ? this : objClone;
else
objClone.toString = this.toString;
return objClone;
}
}
</script>
這段代碼中最關鍵的兩點就是:var objClone = new this.constructor();和objClone[key] = this[key].Clone();。一個完成相同對象建立,一個完成了deep clone。最後那個判斷到底是傳回this還是傳回objClone,是用來對非對象類型或空Array的一個優化。這個Clone方法對所有(不包括Function、Global和Math)JScript對象執行個體的Clone效果分析如下:
顯現對于值類型這個Clone方法不能很好的工作:(,還有一個比較特殊的對象類型,就是Date,它也不能被正常的Clone。不過這個不是很嚴重的問題,要在Clone方法裡面去判斷被Clone的對象是不是Date、Boolean和Number相對來說是很容易的。我沒有加到這個方法中去是為了保持這個方法的清爽,因為我們值類型本身是不存在Clone問題的,指派即就是Clone了。
附Clone方法的測試源代碼:
<html>
<head>
<title>JScript Inherit Research</title>
<meta name="author" content="cmbscqhd;birdshome@部落格園" />
</head>
<body>
<script language="javascript">
</body>
</html>
本文轉自部落格園鳥食軒的部落格,原文連結:http://www.cnblogs.com/birdshome/,如需轉載請自行聯系原部落客。