今天同事問我有as3中對象深度拷貝的問題
原來還真是沒用過,今天google后自己總結下,便于大家參考
as3中通過ByteArray可以進行對象的深度拷貝
import flash.utils.ByteArray;
import
flash.utils.getQualifiedClassName;
import flash.net.*;
import
src.*;
function cloneObject(source:Object) :* {
var
typeName:String = getQualifiedClassName(source);//獲取全名
trace(”輸出類的結
構”+typeName);
//return;
var packageName:String =
typeName.split(”::”)[0];//切出包名
trace(”類的名稱”+packageName);
var
type:Class = getDefinitionByName(typeName) as Class;//獲取Class
trace(type);
registerClassAlias(packageName,
type);//注冊Class
//復制對象
var copier:ByteArray = new ByteArray();
copier.writeObject(source);
copier.position
= 0;
return copier.readObject();
}
有的人說用復制對象那一段不就可以了嗎,但是實際上行不通
對于數組深度復制來說, 復制對象的后面4句代碼就足夠了
var a1:Array=[1,2,3];
var a2:Array =cloneObject(a1);
var a3:Array = a1;
a1.push(”youmila”);
trace(”a1:”+a1+”a2:”+a2+”a3″+a3);
但是對于對象來說肯定不行
用列子測試下
src.youmila.as 代碼:
package src{
public class youmila{
private var $_name:String
=”youmila”;
private var $_num:Number =0;
public function
youmila():void{
trace($_name);
}
public function secondFunc():void{
$_num++;
trace(”this a
called function $_num::”+$_num);
}
}
}
yapollo.as 代碼:
package {
public class yapollo{
private var $_name:String
=”yapollo”;
public var $_num:Number =0;
public function
yapollo():void{
trace($_name);
}
public function secondFunc():void{
$_num++;
trace(”this a called function $_num::”+$_num);
}
}
}
測試實例
var uml1:youmila = new youmila();
var uml2 = cloneObject(uml1);
trace(”
類型”+getQualifiedClassName(uml2));
輸出結果:
youmila
類型Object
原來的對象類型丟失了,所以對于對象而言,四行不夠,必須
用
registerClassAlias來保存類的別名,以用于丟失后恢復類的類型
測試實例
var uml1:youmila = new youmila();
var uml2 = cloneObject(uml1);
trace(”類
型”+getQualifiedClassName(uml2));
var apollo:yapollo = new yapollo();
apollo.secondFunc();
var apollo2 = cloneObject(apollo);
trace(”
第一次輸出復制對象的$_num值”+apollo2.$_num);
trace(”類
型”+getQualifiedClassName(apollo2));
apollo2.secondFunc();
trace(”第二次輸出復制對象的$_num值”+apollo2.$_num);
輸出結果:
youmila
輸出類的結構src::youmila
類的名稱src
[class youmila]
youmila
類
型src::youmila
yapollo
this a called function $_num::1
輸出類的結構
yapollo
類的名稱yapollo
[class yapollo]
yapollo
第一次輸出復制對象的$_num值
1
類型yapollo
this a called function $_num::2
第二次輸出復制對象的$_num值2