サイトトップ

Director Flash 書籍 業務内容 プロフィール

Macromedia Flash非公式テクニカルノート

ObjectCopy.copy()メソッド

ID: FN0603002 Product: Flash

Platform: All
Version: Flash MX 2004 and above

*このクラスは、ドキュメント化されていません。Flash MX 2004でこのクラスを使用するには、「Flash MX 2004 ActionScript 2.0対応Macromedia Flash Remoting」をインストールする必要があります。

ActionScriptクラス名: mx.utils.ObjectCopy

シンタックス[*1]
public static copy(refObj:Object) : Object

[*1] 従来のシンタックスの記述にしたがえば、つぎのとおりです。

ObjectCopy.copy(refObj)

引数
refObj:Object - 複製する対象のオブジェクト。

戻り値
複製されたオブジェクト。

説明
オブジェクトの複製を作成します。つまり、対象オブジェクトが属するクラスの新規インスタンスを作成し、すべてのプロパティをコピーして返します。プロパティがプリミティブ値でなくオブジェクトの場合には、さらにそのプロパティも複製します。

ObjectCopy.copy()メソッドは、プロパティのオブジェクトをさらに複製するために、メソッドの再帰呼出しを行っています。しかし、ActionScriptには、256回を超える再帰呼出しができないという制限がありますので、注意が必要です(「例」のスクリプト003参照)。


つぎのスクリプトは、オブジェクトoSourceを複製して、そのインスタンスを変数oCopyに代入します。

スクリプト001■オブジェクトを複製する

// フレームアクション
import mx.utils.ObjectCopy;
var oSource:Object = {prop0:[0, 1, {a:"test0"}], prop1:{b:2, c:[3, "test1"]}};
var oCopy:Object = ObjectCopy.copy(oSource);

// [デバッグ] > [変数のリストアップ]:
変数 _level0.oSource = [オブジェクト #4, クラス 'Object'] {
  prop1:[オブジェクト #5, クラス 'Object'] {
   c:[オブジェクト #6, クラス 'Array'] [
    0:3,
    1:"test1"
   ],
   b:2
  },
  prop0:[オブジェクト #7, クラス 'Array'] [
   0:0,
   1:1,
   2:[オブジェクト #8, クラス 'Object'] {
    a:"test0"
   }
  ]
 }
変数 _level0.oCopy = [オブジェクト #9] {
  prop0:[オブジェクト #10, クラス 'Array'] [
   0:0,
   1:1,
   2:[オブジェクト #8, クラス 'Object']
  ],
  prop1:[オブジェクト #11] {
   b:2,
   c:[オブジェクト #12, クラス 'Array'] [
    0:3,
    1:"test1"
   ]
  }
 }

Arrayクラスには、配列を複製するArray.concat()メソッドがあります。ただし、Array.concat()メソッドは、配列エレメントに配列を含む場合、そのインスタンスは複製されず、参照が格納されます。つぎのサンプルは、二重配列をArray.concat()ObjectCopy.copy()メソッドを使って、それぞれ複製した場合の結果です[*2]。

スクリプト002■二重配列をArray.concat()とObjectCopy.copy()で複製

// フレームアクション
import mx.utils.ObjectCopy;
var _array:Array = [[0], [1, 2]];
var copy0_array:Array = _array.concat();
var copy1_array:Object = ObjectCopy.copy(_array);

// [デバッグ] > [変数のリストアップ]:
変数 _level0._array = [オブジェクト #4, クラス 'Array'] [
  0:[オブジェクト #5, クラス 'Array'] [
   0:0
  ],
  1:[オブジェクト #6, クラス 'Array'] [
   0:1,
   1:2
  ]
 ]
変数 _level0.copy0_array = [オブジェクト #7, クラス 'Array'] [
  0:[オブジェクト #5, クラス 'Array'],
  1:[オブジェクト #6, クラス 'Array']
 ]
変数 _level0.copy1_array = [オブジェクト #8, クラス 'Array'] [
  0:[オブジェクト #9, クラス 'Array'] [
   0:0
  ],
  1:[オブジェクト #10, クラス 'Array'] [
   0:1,
   1:2
  ]
 ]

プロパティが親のオブジェクトを参照していると、再帰呼出しが無限ループすることになります。そのため、警告のダイアログが表示されます(図001)。

図001■制限を超えた再帰呼出しへの警告ダイアログ

スクリプト003■プロパティが親を参照する場合

// フレームアクション
import mx.utils.ObjectCopy;
var loop:Object = new Object();
loop.self = loop;
var oNeverDoThis:Object = ObjectCopy.copy(loop);


[*2] エレメントの配列がさらに配列を含む多重配列は、ObjectCopy.copy()メソッドを使っても、エレメントのインスタンスが複製されず、参照が格納されるようです。

スクリプト004■ObjectCopy.copy()で多重配列を複製する

// フレームアクション
import mx.utils.ObjectCopy;
var _array:Array = [[0], [[1], [2, 3]]];
var copy_array:Object = ObjectCopy.copy(_array);

// [デバッグ] > [変数のリストアップ]:
変数 _level0._array = [オブジェクト #4, クラス 'Array'] [
  0:[オブジェクト #5, クラス 'Array'] [
   0:0
  ],
  1:[オブジェクト #6, クラス 'Array'] [
   0:[オブジェクト #7, クラス 'Array'] [
    0:1
   ],
   1:[オブジェクト #8, クラス 'Array'] [
    0:2,
    1:3
   ]
  ]
 ]
変数 _level0.copy_array = [オブジェクト #9, クラス 'Array'] [
  0:[オブジェクト #10, クラス 'Array'] [
   0:0
  ],
  1:[オブジェクト #11, クラス 'Array'] [
   0:[オブジェクト #7, クラス 'Array'],
   1:[オブジェクト #8, クラス 'Array']
  ]
 ]

Player
ActionScript 2.0/Flash Player 7以降。

_____

作成者: 野中文雄
作成日: 2006年3月31日


Copyright © 2001-2006 Fumio Nonaka.  All rights reserved.