2012-04-16 122 views
3

在AS3中,我们可以通过两种方式复制数组:深拷贝

newArr = oldArr.concat(); 

var ba:ByteArray = new ByteArray(); 
ba.writeObject(oldArr); 
ba.position = 0; 
newArr = ba.readObject() as Array; 

但是这两种方式,当我需要复制不使用矢量工作一个具有复杂数据类型的Vector。就像Vector.<Point>。当我使用ByteArray复制具有复杂数据类型的Vector时,编译器说新的Vector I将旧的复制为null。

回答

3

写你的对象为ByteArray,例如:

var points:Vector.<Point> = new Vector.<Point>(); 
var pointsCloned:Vector.<Point>; 
var ba:ByteArray = new ByteArray(); 

registerClassAlias("flash.geom.Point", Point); 

points.push(new Point(1, 2)); 
points.push(new Point(3, 4)); 
points.push(new Point(5, 6)); 

ba.writeObject(points); 
ba.position = 0; 
pointsCloned = ba.readObject() as Vector.<Point>; 

trace(points); 
trace(pointsCloned); 

由于这个blog post之前注册类的别名有flash.net.registerClassAlias

+0

哦,它的工作原理well.Thanks!但为什么它只能在注册一个类别别名之后才起作用? – Piggyi 2012-04-17 13:16:16

+0

@Piggyi你可以在[ActionScript 3.0参考资料]中找到简短的解释(http://livedocs.adobe.com/livecycle/8.2/programLC/common/langref/flash/net/package.html#registerClassAlias%28%29 )。这就是我所知道的一切。 – Matthias 2012-04-17 15:09:55

0

另一种选择是使用.map(),像:

function pointCloner(item:Point, index:int, vector:Vector.<Point>):Point { 
    return item.clone(); 
} 

var newVector:Vector.<Point> = oldVector.map(pointCloner);