Flex和ActionScript的新增功能對我來說很裸露。如何在ActionScript中創建對象的未引用副本
我有一個ArrayCollection充滿了自定義對象。我需要能夠創建這個數組的副本,執行一些功能和對數組和對象內的修改。然後,我需要基本上將它重新設置回原始存儲的副本,從我開始之前。
問題(和我發現並正在嘗試解決的錯誤)是我似乎無法創建此數組的副本,它不直接引用原始數組。即:對拷貝的修改也會修改原件。
private var original:ArrayCollection = new ArrayCollection();
...
private function doStuff()
{
var modified:ArrayCollection = original;
for each (var myObj:CustomObject in modified)
...
}
我已經成功地得到使用ObjectUtil.clone最近...
private var original:ArrayCollection = new ArrayCollection();
...
private function doStuff()
{
var modified:ArrayCollection = ObjectUtil.clone(original);
for each (var myObj:CustomObject in modified)
{
//Error here as the clone worked, however the objects in the array reverted to the base Object Class and couldn't be cast back to their actual CustomObject type
}
}
這裏有一個工作示例:
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
creationComplete="application1_creationCompleteHandler(event)">
<fx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.events.FlexEvent;
private var originals:ArrayCollection;
protected function application1_creationCompleteHandler(event:FlexEvent):void
{
originals = new ArrayCollection();
for (var i:int = 0; i <= 5; i++)
{
var myObj:CustomObject = new CustomObject();
originals.addItem(myObj);
}
doStuff();
}
private function doStuff():void
{
var modified:ArrayCollection = clone(originals);
for (var i:int = 0; i < modified.length; i++)
{
var myDupObj:CustomObject = modified[i] as CustomObject;
//do stuff
trace(myDupObj);
}
}
private function clone(source:Object):*
{
var myBA:ByteArray = new ByteArray();
myBA.writeObject(source);
myBA.position = 0;
return(myBA.readObject());
}
]]>
</fx:Script>
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
</s:Application>
而且CustomObject.as
package
{
public class CustomObject
{
public var a:String;
public var b:String;
public var c:String;
public function CustomObject()
{
a = "Hello";
b = "World";
c = "Good-Bye";
}
}
}
我曾與克隆,因爲我在評論中提到的問題出現了,該陣列中的所有對象還原爲基本對象類,並試圖將它們轉換成合適的對象時會拋出一個coersion異常類型。我已經看到並嘗試了您發佈的功能以及相同的結果。 – kweb
我也嘗試循環原始數組和克隆單個對象...即:modified.addItem(clone(originals [i])as CustomObject);這會產生一個空對象數組。 – kweb
您提供可運行樣本嗎? – JeffryHouser