読者です 読者をやめる 読者になる 読者になる

ActionScript3 における deep copy

JavaScript の話題が出たので AS3 での方法も。ActionScript3 でコアクラスオブジェクトを deep copy するには、

public static function clone(arg:*):* {
    var b:ByteArray = new ByteArray();
    b.writeObject(arg);
    b.position = 0;
    return b.readObject();
}
var hash:Object = {
    ary: [0,1,2,3]
};
var hashClone:Object = ObjectUtil.clone(hash);
hash.ary[3] = 'a';
hash; // #<Object:{ary:0, 1, 2, a}>
hashClone; // #<Object:{ary:0, 1, 2, 3}>

のやり方が一番楽で高速だと思います。一度 ByteArray で AMF にしてからその AMF を再度デコードするという。Ruby での Marshal.load(Marshal.dump(obj)) の方法に似てますね。
またこの方法だと、コアクラス以外のオブジェクトは public な変数(readonly な変数は無理?)だけを抽出して Object として取得できたりします。ので、とあるインスタンスの状態を取得して後で復元なんかも割とこの方法でうまくいったりします。