`
joe.feng
  • 浏览: 134278 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

AS3中对象的深度复制

    博客分类:
  • Flex
阅读更多

复制复杂对象(例如ArrayCollection,XML)时,可以使用ObjectUtil.copy()方法,代码如下:

 

//Object对象:
var obj1:Object = {name:"name01",data:"data01"};
var obj2:Object = ObjectUtil.copy(obj1);
obj2.name = "name02";
obj2.data = "data02";
ArrayCollection:
var ac2:ArrayCollection = ObjectUtil.copy(ac) as ArrayCollection;
//XML:
var myXML2:XML = ObjectUtil.copy(myXML1) as XML;

 

 因为copy方法返回的结果是Object类型,如果对于自定义的对象,copy方法返回结果类型就会丢失,变成Object,而且无法转换成自定义的对象,我们需要对ObjectUtil.copy()方法进行修改,让他支持自定义的类型。

源码如下:

 

public static function copy(value:Object):Object
    {
        var buffer:ByteArray = new ByteArray();
        buffer.writeObject(value);
        buffer.position = 0;
        var result:Object = buffer.readObject();
        return result;
    }

 

 所做修改如下:

 

import flash.utils.ByteArray;
import flash.utils.getQualifiedClassName;
import flash.net.*;
import src.*;

function cloneObject(source:Object) :* {
    var typeName:String = getQualifiedClassName(source);//获取全名
    trace(”输出类的结构”+typeName);
    //return;
    var packageName:String = typeName.split(”::”)[0];//切出包名
    trace(”类的名称”+packageName);
    var type:Class = getDefinitionByName(typeName) as Class;//获取Class
    trace(type);
    registerClassAlias(packageName, type);//注册Class
    //复制对象
    var copier:ByteArray = new ByteArray();
    copier.writeObject(source);
    copier.position = 0;
    return copier.readObject();
}

 

 有的人说用复制对象那一段不就可以了吗,但是实际上行不通。对于数组深度复制来说, 复制对象的后面4句代码就足够了。

 

var a1:Array=[1,2,3];
var a2:Array =cloneObject(a1);
var a3:Array = a1;
a1.push(”youmila”);
trace(”a1:”+a1+”a2:”+a2+”a3″+a3);

 

 但是对于对象来说肯定不行,用列子测试下,src.youmila.as 代码: 

 

package src{

public class youmila{
    private var $_name:String =”youmila”;
    private var $_num:Number =0;
    public function youmila():void{
    trace($_name);
}

public function secondFunc():void{
    $_num++;
    trace(”this a called function $_num::”+$_num);
}
}
}

 

 yapollo.as 代码: 

 

package {

public class yapollo{
    private var $_name:String =”yapollo”;
    public var $_num:Number =0;
    public function yapollo():void{
    trace($_name);
}

public function secondFunc():void{
    $_num++;
    trace(”this a called function $_num::”+$_num);
}
}
}

 测试实例: 

 

var uml1:youmila = new youmila();
var uml2 = cloneObject(uml1);
trace(”类型”+getQualifiedClassName(uml2));

 输出结果: 

 

youmila

类型Object

 

原来的对象类型丢失了,所以对于对象而言,四行不够,必须用registerClassAlias来保存类的别名,以用于丢失后恢复类的类型,测试实例: 

 

var uml1:youmila = new youmila();
var uml2 = cloneObject(uml1);
trace(”类型”+getQualifiedClassName(uml2));
var apollo:yapollo = new yapollo();
apollo.secondFunc();
var apollo2 = cloneObject(apollo);
trace(”第一次输出复制对象的$_num值”+apollo2.$_num);
trace(”类型”+getQualifiedClassName(apollo2));
apollo2.secondFunc();
trace(”第二次输出复制对象的$_num值”+apollo2.$_num);

 输出结果: 

 

youmila

输出类的结构src::youmila

类的名称src

[class youmila]

youmila

类型src::youmila

yapollo

this a called function $_num::1

输出类的结构yapollo

类的名称yapollo

[class yapollo]

yapollo

第一次输出复制对象的$_num值1

类型yapollo

this a called function $_num::2

第二次输出复制对象的$_num值2

 

 

分享到:
评论

相关推荐

    C# 使用反射来实现对象的深度复制方法

    以下是一个使用反射实现对象深度复制的示例代码: ```csharp public static class DeepCopyHelper { public static object Copy(this object obj) { Object targetDeepCopyObj; Type targetType = obj.GetType...

    AS 3 错误代码中文说明

    常见于将原型函数从一个对象复制到另一个对象,但目标对象类型与原始对象类型不符的情况。 - **解决方案**:确保调用的目标对象类型与方法的预期对象类型相匹配,可以参考 ECMAScript 语言规范第三版的第 15 章获取...

    flash as3 programming 中文官方

    1. **ActionScript 3.0**:AS3是一种强大的面向对象的编程语言,被集成到Flash Professional中,用于创建动态网页内容、游戏、应用程序等。它相比前代版本提供了更好的性能、增强的安全性和更多的编程功能。 2. **...

    AS3高手之路

    - **Sprite 类**:Sprite 类是AS3中最常用的显示对象容器之一,它可以包含多个子项,并提供了一系列用于控制这些子项的方法。 #### 3. 网络通信与资源管理 - **Socket 类**:用于实现客户端与服务器之间的网络通信...

    as3错误代码内容.doc

    - 确保所调用的API在当前版本的AS3中仍然可用。 #### 1007 尝试对非构造函数进行实例化 - **描述**:此错误发生在试图使用非构造函数创建对象时。 - **解决方法**: - 使用正确的构造函数进行实例化。 - 确保...

    [转]45度游戏的另类深度排序遮挡部分半透明(copyPixels)

    copyPixels是ActionScript 3(AS3)中一个非常重要的功能,它允许开发者将一个显示对象的一部分复制到另一个位置。在处理遮挡和半透明效果时,copyPixels可以用于复制并覆盖已有像素,实现像素级别的遮挡。例如,当...

    javascript克隆对象深度介绍

    但需要注意的是,如果数组中有引用类型的值,这种方法就不能实现深度克隆,因为它们不会复制嵌套对象或数组。 另外,JSON序列化和反序列化也是一种实现深度克隆的简单方法: ```javascript var s = JSON.stringify...

    一个flashas3.0的拼图游戏代码

    本篇文章将深入探讨如何利用AS3.0开发一款拼图游戏,通过分析提供的“Puzzleas3”压缩包中的源代码,我们将学习到AS3.0的基本语法、事件处理、图形绘制、动画制作以及游戏逻辑设计等关键知识点。 首先,我们要了解...

    stage3d参考

    AS3中,这些着色器通常以GLSL(OpenGL Shading Language)的形式编写,然后通过`Context3D.compileProgram`进行编译。 3. **VertexBuffer3D和IndexBuffer3D**:这两个类用于存储3D模型的数据,如顶点坐标、颜色、...

    JavaScript对象拷贝与Object.assign用法实例分析

    JavaScript中的对象拷贝是编程中常见的操作,尤其在处理复杂数据结构时显得尤为重要。...`Object.assign()`方法提供了一种便捷的浅拷贝方式,但无法实现完全的深拷贝,需要结合其他技术或自定义函数来完成深度复制。

    AS脚本常用命令

    42. **SwapDepths**: `swapDepths(target1, target2)`交换两个对象的深度。 43. **Tell Target**: `tellTarget(target, command)`让命令作用于特定目标。 44. **ToggleHighQuality**: `toggleHighQuality()`在高...

    DeepCopier:一个小型且高效的库,可以按表达式树深层复制对象

    1.深度复制源对象。 SomeType obj1 = new SomeType (); SomeType obj2 = Copier . Copy ( obj1 ); List < SomeType> list1 = new List < SomeType>{ obj1 }; List < SomeType> list2 = Copier . Copy ( list1 ); 2....

    模仿BeJSON,HiJson格式化JSON,在AS控制台分层输出接口日志

    在Android Studio(AS)中,开发者往往需要手动复制JSON数据到这些网站进行格式化,但这无疑增加了工作效率的负担。为了解决这个问题,我们可以模仿BeJSON和HiJson的逻辑,在AS的控制台直接实现JSON数据的分层输出。...

    ActionScript3.0开发人员指南

    - **使用着色器**:详细解释如何在AS3中调用PixelBender着色器,以及如何将处理结果应用到显示对象上。 #### 第16章 使用影片剪辑 影片剪辑是Flash和AS3中的一个重要组成部分,用于组织和控制动画序列。 - **影片...

    flash ActionScript.3小技巧

    这可以通过使用 `ByteArray` 类实现深度复制: ```actionscript function clone(source:Object):* { var copier:ByteArray = new ByteArray(); copier.writeObject(source); copier.position = 0; return ...

    FlashMX AS教程

    ActionScript (AS) 是一种面向对象的编程语言,最初由Macromedia公司开发,用于Adobe Flash Player和Adobe AIR等环境中的交互式内容创建。在FlashMX中,AS被广泛应用于创建动态效果、交互式内容和游戏。 ##### 1. ...

    Python库 | cdk-s3bucket-ng-1.1.128.tar.gz

    3. **生命周期策略**:允许设置对象过期规则,例如自动删除旧版本或归档数据,以优化成本和合规性。 4. **版本控制**:启用存储桶的版本控制,确保数据的完整性和可恢复性。 5. **跨区域复制**:支持跨AWS区域复制...

    CreateRef(大图倒影)

    《CreateRef(大图倒影)——探索AS3中的图像反射技术》 在计算机图形学领域,倒影效果是一种常见的视觉技巧,它为用户界面或游戏场景增添了几分真实感和深度。在AS3(ActionScript 3)中,我们可以利用编程手段实现...

    MO20对象分析程序

    MO20对象分析程序是一种用于GIS(地理信息系统)领域中的高级工具,旨在帮助用户进行地图对象的深度分析与处理。该程序包含了多种常量定义、数据类型定义以及各种对象的操作方法,能够有效地支持地图编辑、图像层...

    Excel-VBA实用技巧范例-利用文件对象模型FSO操作文件夹.zip

    在Excel VBA编程中,文件系统对象模型(FileSystemObject,简称FSO)是一个非常重要的工具,它允许开发者在VBA宏中对文件和文件夹进行各种操作,如创建、删除、复制、移动以及读写文件等。这个压缩包“Excel-VBA实用...

Global site tag (gtag.js) - Google Analytics