天天看點

相容值類型的JavaScript對象Clone方法

當然由于我們可以使用typeof方法擷取對象的基本類型,然後一個switch,該幹嘛幹嘛不就搞定了嗎?這個...

我希望我的Clone能不去判斷每種具體的類型,而盡量使用JavaScript語言提供的機制來完成,這也是上次那個Clone方法不能Clone值類型的原因。

相容值類型的JavaScript對象Clone方法

 objClone = new this.constructor(this.valueOf());

    代替我原來的:

相容值類型的JavaScript對象Clone方法

 objClone = new this.constructor();

相容值類型的JavaScript對象Clone方法

 對于 date, boolean, number 這三種基本的資料類型,執行 

相容值類型的JavaScript對象Clone方法

 var objClone = new this.constructor(); 

相容值類型的JavaScript對象Clone方法

 的時候,得到的是預設值。而真實的值又沒有屬性可引用到,是以,隻能在初始化的時候,以參數形式賦預設值。 

相容值類型的JavaScript對象Clone方法

 var objClone = new this.constructor(this.valueOf()); 

    不過後來麻袋發現它的代碼處理Object的時候有問題,于是給出了:

相容值類型的JavaScript對象Clone方法

 var objClone; 

相容值類型的JavaScript對象Clone方法

 if ( this.constructor == Object ) 

相容值類型的JavaScript對象Clone方法

    objClone = new this.constructor(); 

相容值類型的JavaScript對象Clone方法

 else 

相容值類型的JavaScript對象Clone方法

    objClone = new this.constructor(this.valueOf()); 

相容值類型的JavaScript對象Clone方法

    obj = new Object([value]) 

    參數

    obj 

    必選項。要指派為 Object 對象的變量名。 

    value 

    可選項。任意一種 JScript 基本資料類型。(Number、Boolean、或 String。)如果 value 為一個對象,傳回不作改動的該對象。如果 value 為 null、undefined,或者沒有給出,則産生沒有内容的對象。

    上面紅字中的"對象",因該指的是:new Object()這樣的執行個體,用代碼來翻譯就是:

相容值類型的JavaScript對象Clone方法

  var obj = new Object();

相容值類型的JavaScript對象Clone方法

  obj.asdf = 'asdf';

相容值類型的JavaScript對象Clone方法

  obj2 = new Object(obj);

相容值類型的JavaScript對象Clone方法

  alert(obj===obj2);

    結果是啥?true!

    我在原來那個Clone的測試中,設計我的測試代碼的第一個資料類型時,出了點錯誤,我用Literal的文法方式寫的obj其實是Object的執行個體。本來我是想測試使用者定義類型,應該這麼弄:

相容值類型的JavaScript對象Clone方法

  function JSClass()

相容值類型的JavaScript對象Clone方法

  {

相容值類型的JavaScript對象Clone方法

      this.abc = 'abc';

相容值類型的JavaScript對象Clone方法

      this.faint = ['f', 'a', 'i', 'n', 't'];

相容值類型的JavaScript對象Clone方法

      this.toString = function()

相容值類型的JavaScript對象Clone方法

      {

相容值類型的JavaScript對象Clone方法

          return 'abc:' + this.abc + ', faint:[' + this.faint + ']';

相容值類型的JavaScript對象Clone方法

      };

相容值類型的JavaScript對象Clone方法

  }

相容值類型的JavaScript對象Clone方法

  var jsClass = new JSClass();

相容值類型的JavaScript對象Clone方法

  var classClone = jsClass.Clone();

相容值類型的JavaScript對象Clone方法

  var classClone2 = jsClass.Clone();

相容值類型的JavaScript對象Clone方法

  classClone2.abc = 'def';

相容值類型的JavaScript對象Clone方法

  for ( var i=0 ; i < classClone2.faint.length ; ++i ) classClone2.faint[i] = '-'; 

相容值類型的JavaScript對象Clone方法

  Render('JSclass', jsClass, classClone, classClone2, true);

     這個JSClass也是适合使用new this.consturctor(this.valueOf())這種方式來Clone,這時的參數不會影響它生成的對象的。

     結合麻袋的修改,相容版的JavaScript Clone方法出來了

相容值類型的JavaScript對象Clone方法

相容值類型的JavaScript對象Clone方法

 // Authors Birdshome, 麻袋@部落格園  

相容值類型的JavaScript對象Clone方法

 Object.prototype.Clone = function()

相容值類型的JavaScript對象Clone方法

 {

相容值類型的JavaScript對象Clone方法

    var objClone;

相容值類型的JavaScript對象Clone方法

    if ( this.constructor == Object ) objClone = new this.constructor(); 

相容值類型的JavaScript對象Clone方法

    else objClone = new this.constructor(this.valueOf()); 

相容值類型的JavaScript對象Clone方法

    for ( var key in this )

相容值類型的JavaScript對象Clone方法

    {

相容值類型的JavaScript對象Clone方法

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

相容值類型的JavaScript對象Clone方法

        { 

相容值類型的JavaScript對象Clone方法

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

相容值類型的JavaScript對象Clone方法

            { 

相容值類型的JavaScript對象Clone方法

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

相容值類型的JavaScript對象Clone方法

            }

相容值類型的JavaScript對象Clone方法

            else

相容值類型的JavaScript對象Clone方法

            {

相容值類型的JavaScript對象Clone方法

                objClone[key] = this[key];

相容值類型的JavaScript對象Clone方法
相容值類型的JavaScript對象Clone方法

        }

相容值類型的JavaScript對象Clone方法

    }

相容值類型的JavaScript對象Clone方法

    objClone.toString = this.toString;

相容值類型的JavaScript對象Clone方法

    objClone.valueOf = this.valueOf;

相容值類型的JavaScript對象Clone方法

    return objClone; 

相容值類型的JavaScript對象Clone方法

 }    

    至于需要不要把Object的預設方法都copy一遍,我也說不清楚,就暫時copy這兩個最容易被重寫的吧,不然要列一大排地說。

    測試結果附圖:

    測試代碼:

相容值類型的JavaScript對象Clone方法

    <script language="javascript">

相容值類型的JavaScript對象Clone方法

</script>

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

繼續閱讀