天天看點

對JScript對象的執行個體Clone的一個實作

    實作Clone最關鍵的就是要建立一個和原對象類型相同的對象,不然還叫什麼Clone呢?然後再把原對象裡的值Copy到目标對象,如果遇到值本身是對象的,還需要繼續遞歸建立和複制資料。

    JScript對象執行個體的Clone方法代碼如下:

對JScript對象的執行個體Clone的一個實作

<script language="javascript">

對JScript對象的執行個體Clone的一個實作

Object.prototype.Clone = function()

對JScript對象的執行個體Clone的一個實作

{

對JScript對象的執行個體Clone的一個實作

    var objClone = new this.constructor();

對JScript對象的執行個體Clone的一個實作

    for ( var key in this )

對JScript對象的執行個體Clone的一個實作

    {

對JScript對象的執行個體Clone的一個實作

        if ( objClone[key] != this[key] )

對JScript對象的執行個體Clone的一個實作

        { 

對JScript對象的執行個體Clone的一個實作

            if ( typeof(this[key]) == 'object' )

對JScript對象的執行個體Clone的一個實作

            { 

對JScript對象的執行個體Clone的一個實作

                objClone[key] = this[key].Clone();

對JScript對象的執行個體Clone的一個實作

            }

對JScript對象的執行個體Clone的一個實作

            else

對JScript對象的執行個體Clone的一個實作

            {

對JScript對象的執行個體Clone的一個實作

                objClone[key] = this[key];

對JScript對象的執行個體Clone的一個實作
對JScript對象的執行個體Clone的一個實作

        }

對JScript對象的執行個體Clone的一個實作

    }

對JScript對象的執行個體Clone的一個實作

    if ( !objClone || ('' + objClone) == '' )

對JScript對象的執行個體Clone的一個實作
對JScript對象的執行個體Clone的一個實作

        return (new String(this) + objClone) ? this : objClone;

對JScript對象的執行個體Clone的一個實作
對JScript對象的執行個體Clone的一個實作

    else

對JScript對象的執行個體Clone的一個實作
對JScript對象的執行個體Clone的一個實作

        objClone.toString = this.toString;

對JScript對象的執行個體Clone的一個實作

        return objClone; 

對JScript對象的執行個體Clone的一個實作

    } 

對JScript對象的執行個體Clone的一個實作

}    

對JScript對象的執行個體Clone的一個實作

</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方法的測試源代碼:

對JScript對象的執行個體Clone的一個實作

<html>

對JScript對象的執行個體Clone的一個實作

<head>

對JScript對象的執行個體Clone的一個實作

    <title>JScript Inherit Research</title>

對JScript對象的執行個體Clone的一個實作

    <meta name="author" content="cmbscqhd;birdshome@部落格園" />

對JScript對象的執行個體Clone的一個實作

</head>

對JScript對象的執行個體Clone的一個實作

<body>

對JScript對象的執行個體Clone的一個實作

    <script language="javascript">

對JScript對象的執行個體Clone的一個實作
對JScript對象的執行個體Clone的一個實作
對JScript對象的執行個體Clone的一個實作
對JScript對象的執行個體Clone的一個實作

</body>

對JScript對象的執行個體Clone的一個實作

</html>

對JScript對象的執行個體Clone的一個實作

本文轉自部落格園鳥食軒的部落格,原文連結:http://www.cnblogs.com/birdshome/,如需轉載請自行聯系原部落客。

繼續閱讀