|
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.
|