Flex 中對象的拷貝使用的是 ByteArray 類的 writeObject 方法。函數
直接上代碼:spa
private function cloneObj(target:Object): *{ var copier:ByteArray = new ByteArray(); copier.writeObject(target); copier.position = 0; return copier.readObject(); }
var testTarget:Object = { name: 'zyc', email: 'zyc@zyc.com', sex: 'mail', addr: { pro: 'hz', city: ['hz','zh'] } }; var re1:Object = cloneObj(testTarget); trace(re1.addr.pro);
//輸出 hz
writeObjet 方法實現的直接就是對象的深層拷貝。從上面的代碼來看,as的拷貝要比js實現起來簡單不少,不須要去遍歷每一個對象屬性。code
可是,as 中用的更多的仍是各類自定義類的實例,每每也須要對實例進行拷貝操做。對象
若直接使用上面的 cloneObject 方法拷貝類的實例,默認會忽略拷貝該實例對象。看代碼:blog
// Person 爲自定義類 有name,email,sex 三個屬性及 hello 方法
var testTargetWithClass:Person = new Person();
testTargetWithClass.name = 'Jan'; testTargetWithClass.email = 'Jan@qq.com'; testTargetWithClass.sex = 'femail'; testTargetWithClass.hello();// 輸出: Jan Jan@qq.com femail var re2:Object; re2 = cloneObj(testTargetWithClass); re2.hello();// error 對象不存在該方法
拷貝後的結果對象類型默認爲Object 而不是 Person類型,全部也沒有Person類的hello()方法。ci
解決辦法是 registerClassAlias 方法,這個方法在以前往SharedObejct存入用戶自定義類的數據時,也用到過。get
這是一個全局函數,需有兩個參數 registerClassAlias('aliasClass', customClass); aliasClass 名隨便取,customClass爲用戶自定義的類名。it
registerClassAlias("aliasPerson", Person); var re2:Object; re2 = cloneObj(testTargetWithClass); re2.hello();// 輸出: Jan Jan@Jan.com femail
這裏有兩點須要注意:io
1. 自定義類的構造函數裏面不能有參數。上面的例子中,若是將Person類的構造函數,改爲:function
public function Person(name:String, email:String, sex: String = 'mail') { super(); _name = name; _email = email; _sex = sex; }
在registerClassAlias過程當中,程序會報錯。
2. 沒法實現對 Flex 組件類的拷貝。若是須要拷貝一個 Spark 內的 Image 對象,不能使用這種方法。