Flex 學習筆記------對象的深層拷貝

對象的深層拷貝

Flex 中對象的拷貝使用的是 ByteArray 類的 writeObject 方法。函數

1. 簡單對象

直接上代碼: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 中用的更多的仍是各類自定義類的實例,每每也須要對實例進行拷貝操做。對象

2. 自定義類的實例

若直接使用上面的 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 對象,不能使用這種方法。

相關文章
相關標籤/搜索