如何在Flex中克隆一个对象?

9

我想克隆一个Canvas对象,其中包含一个带有多个几何形状的Degrafa Surface。

我尝试了一种简单的方法:

return ObjectUtil.copy(graph_area) as Canvas;

这导致了错误:

TypeError: Error #1034: Type Coercion failed: cannot convert Object@63b1b51 to com.degrafa.geometry.Geometry.
TypeError: Error #1034: Type Coercion failed: cannot convert Object@63b1039 to com.degrafa.geometry.Geometry.
TypeError: Error #1009: Cannot access a property or method of a null object reference.
    at mx.core::Container/addChildAt()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\core\Container.as:2196]
    at mx.core::Container/addChild()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\core\Container.as:2140] ...
5个回答

9
您需要的是深拷贝,即生成一个与原始实例具有相同信息的新实例。
我所知道的唯一方法是使用ByteArray,如下所示:
private function clone(source:Object):*
{
    var buffer:ByteArray = new ByteArray();
    buffer.writeObject(source);
    buffer.position = 0;
    return buffer.readObject();
}

AS3缺乏Object.clone()方法...


2
如果您查看ObjectUtil.copy()的源代码,它执行的是完全相同的操作。 - jeremy.mooer
是的,它正在使用 AMF 对对象进行序列化和反序列化。 - LiraNuna
我在这段代码中遇到了错误...错误:错误#2030:遇到文件结尾。 在flash.utils :: ByteArray / readObject()处。 - Devendra
该网址http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/utils/ObjectUtil.html#copy%28%29的文档明确说明此函数不适用于UI对象。 - Dale_Plante

8

ObjectUtil

静态方法ObjectUtil.copy()是AS3中的“Object.clone()”:

public static function copy(value:Object):Object

复制指定的对象并返回对该副本的引用。使用本地序列化技术进行复制,因此将尊重自定义序列化。
此方法旨在复制数据对象,例如集合的元素。它不适用于复制UIComponent对象,例如TextInput控件。如果您想创建特定UIComponent对象的副本,可以创建组件的子类并实现clone()方法或其他方法来执行复制。

1

我发现自己尝试了更像这样的东西,但似乎仍然无法复制TextArea(也称为UI对象)...

public function duplicateObject(sourceObject:*, targetObject:*):void {
    var buffer:ByteArray = new ByteArray();
    buffer.writeObject(sourceObject);
    buffer.position = 0;
    targetObject = buffer.readObject();
}

1

我遇到了同样的问题(我创建了一个NamedEntity接口),在这里寻找答案,但只有通过调用registerClassAlias方法才能使其正常工作(我从http://richapps.de/?p=34中获取了该方法)。就像这样:

public static function clone(namedEntity:NamedEntity):NamedEntity {
registerClassAlias('test',ReflectionUtil.classByObject(namedEntity));
var returnObject:NamedEntity = ObjectUtil.copy(namedEntity) as NamedEntity;
}

0

我认为ObjectUtil.copy不能用于克隆画布。 根据Flex文档:

Copy 此方法旨在复制数据对象,例如集合的元素。它不适用于复制UIComponent对象,例如TextInput控件。如果您想创建特定UIComponent对象的副本,则可以创建组件的子类并实现clone()方法或其他方法来执行复制。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接