如何在Flex中克隆对象?

时间:2009-02-19 16:20:48

标签: flex flash actionscript-3 clone degrafa

我想克隆一个Canvas对象,它包含一个带有几个几何形状的Degrafa曲面。

我尝试了天真的方法:

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 个答案:

答案 0 :(得分:9)

您想要的是一个深层副本,生成一个与原始信息相同的新实例。

我知道如何操作的唯一方法是使用ByteArray,如下所示:

private function clone(source:Object):*
{
    var buffer:ByteArray = new ByteArray();
    buffer.writeObject(source);
    buffer.position = 0;
    return buffer.readObject();
}

AS3真的缺少Object.clone()......

答案 1 :(得分:8)

ObjectUtil

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

public static function copy(value:Object):Object
  

复制指定的Object和   返回对副本的引用。该   使用本机进行复制   序列化技术。这意味着   自定义序列化将是   在复制期间受到尊重。

     

此方法专为复制而设计   数据对象,例如a的元素   采集。它不适合   复制UIComponent对象,例如   一个TextInput控件。如果你想   创建特定UIComponent的副本   对象,你可以创建一个子类   组件并实现一个clone()   方法或其他方法来执行   副本。

答案 2 :(得分:1)

我发现自己尝试了更像这样的东西唉它似乎还没有复制TextArea(又名UI对象)......

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

答案 3 :(得分: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;
}

答案 4 :(得分:0)

我认为ObjectUtil.copy不会用于克隆画布。 根据flex doc:

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