ActionScriptでディープコピー

上記のActionScriptでのオブジェクトのディープコピーについてのエントリを読みました。
もともとディープコピーを使う機会が無かったので、気づかずに通り過ぎていましたが、ActionScriptのコピー演算子ってシャローコピーなのですね。

そこで、上記エントリではAS3でディープコピーを行う手段を載せておられますが、そのコードはほぼ同じものがFlashCS3のヘルプ「配列のコピー」というページにも載っていました。

検証

以下のスクリプトで、ヘルプに載っていたコードの検証を行ってみました。

/* TestCopy.as */
package {
  import flash.display.Sprite;
  import flash.utils.ByteArray;

  public class TestCopy extends Sprite
  {
    /**
     *  コピーテストを行います.
     */
    public function TestCopy()
    {
      // オブジェクト.
      var arr:Array = [0,1,2,3];
      // シャローコピーしたオブジェクト.
      var arrShallowCopy:Object = arr;
      // ディープコピーしたオブジェクト.
      var arrDeepCopy:Object    = clone(arr);

      // コピー元の要素を変えてみます.
      arr[3] = 'a';

      // それぞれ確認.
      trace( arr[3] );            //=> 'a'
      trace( arrShallowCopy[3] ); //=> 'a'
      trace( arrDeepCopy[3] );    //=> '3'
    }

    /**
     *  ディープコピーを行います.
     */
    public static function clone( arg:* ) :*
    {
      var myBA:ByteArray = new ByteArray();
      myBA.writeObject(arg);
      myBA.position = 0;
      return( myBA.readObject() );
    }
  }
}

fdbで実行すると、ソースに書いたようなtrace出力が行われ、「通常のコピーではシャローコピー、作成したメソッドcloneを使ったらディープコピーが行われる」ことが確認されました。