【问题标题】:How to clone an object in Flex?如何在 Flex 中克隆对象?
【发布时间】:2009-02-19 16:20:47
【问题描述】:

我想克隆一个 Canvas 对象,其中包含一个 Degrafa Surface 和几个 Geometry 形状。

我尝试了幼稚的方法:

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] ...

【问题讨论】:

    标签: apache-flex flash actionscript-3 clone degrafa


    【解决方案1】:

    你想要的称为深拷贝,生成一个与原始信息相同的新实例。

    我知道如何做到这一点的唯一方法是使用 ByteArray,如下所示:

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

    AS3 确实缺少 Object.clone()...

    【讨论】:

    • 如果您查看 ObjectUtil.copy() 的源代码,它的作用完全相同。
    • 是的,它使用 AMF 对对象进行序列化和反序列化。
    • 我收到此代码错误...错误:错误 #2030:遇到文件结尾。在 flash.utils::ByteArray/readObject()
    • help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/… 的文档明确指出此函数不适用于 UI 对象
    【解决方案2】:

    ObjectUtil

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

    public static function copy(value:Object):Object
    

    复制指定的对象并 返回对副本的引用。这 使用本机制作的副本 序列化技术。这表示 自定义序列化将是 在复制过程中受到尊重。

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

    【讨论】:

      【解决方案3】:

      我发现自己在尝试更多类似的东西,可惜它似乎仍然没有复制 TextArea(又名 UI 对象)...

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

      【讨论】:

        【解决方案4】:

        我遇到了同样的问题(对于我创建的 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;
        }
        

        【讨论】:

          【解决方案5】:

          我认为 ObjectUtil.copy 不适用于克隆画布。 根据弹性文档:

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

          【讨论】:

            猜你喜欢
            • 2011-09-19
            • 2018-08-09
            • 1970-01-01
            • 2010-11-08
            • 2012-11-17
            • 2010-09-07
            • 2012-12-07
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多