`

as 对象深度拷贝

    博客分类:
  • flex
阅读更多

 

这是一篇关于as3对象深度拷贝的问题
今天自己总结下,便于大家参考

as3中通过ByteArray可以进行对象的深度拷贝
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

 

package {
        import flash.utils.ByteArray;       
        import flash.utils.getQualifiedClassName;
        import flash.utils.getDefinitionByName;       
        import flash.net.registerClassAlias;


        public class CopyUtil{
                public static function clone(object:Object):Object{
                        var qClassName:String = getQualifiedClassName(object);
                        var objectType:Class = getDefinitionByName(qClassName) as Class;
                        registerClassAlias(qClassName, objectType);
                        var copier : ByteArray = new ByteArray();
                        copier.writeObject(object);
                        copier.position = 0;
                        return copier.readObject();
                }
        }
}

 

var instanceA : ClassA = new ClassA();
var instanceCopy : ClassA = CopyUtil.clone(instanceA ) as ClassA;
trace(instanceCopy == instanceA)//fale;
trace(instanceCopy  is ClassA) // true;
trace(instanceCopy is superClass) //true;

  

thanks:http://flexjs.cn/post/5.html

分享到:
评论

相关推荐

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

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

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

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

    javascript克隆对象深度介绍

    对于简单的数组,如果没有包含引用类型的值,可以使用`Array.prototype.concat()`或`Array.prototype.slice(0)`方法进行深度拷贝。这两种方法都会返回一个新的数组实例,不影响原始数组。但需要注意的是,如果数组中...

    ActionScript3.0开发人员指南

    - **对象动画**:介绍如何使用AS3的动画功能,实现对象的位置、大小和透明度变化。 - **舞台方向**:讨论如何设置舞台的方向,以适应不同的屏幕布局和用户界面设计。 - **动态加载显示内容**:解释如何从外部资源...

    克隆javascript对象的三个方法小结

    接着遍历新实例的所有属性,如果属性值是对象,则再次调用`clone3`进行深度克隆。这种方法可以处理对象的原型链,但仍然不能处理循环引用的对象。 **总结** 这三种方法各有优缺点: 1. **方法一**是最基础的实现,...

    js的Object.assign用法示例分析

    - `Object.assign()`不会执行深度拷贝,它只会拷贝源对象的顶层属性。如果源对象的属性值是另一个对象,那么目标对象将引用同一个对象,而不是创建一个新副本。 - 非对象类型的值(如字符串、数字、布尔值)会被转换...

    ActionScript.3.0动画教程[中英文版+源码]

    教程分为中英文两个版本,英文版保持了原始的表述和术语,方便用户直接查阅官方文档或者进行深度学习,同时提供选择、拷贝和复制的功能,便于学习者在实践中参考和运用。中文版则更适合中文环境下的初学者,能够帮助...

    提高C#编程水平的50个技巧

    27. **避免ICloneable**:此接口容易引发误解,应使用深度拷贝或浅拷贝代替。 28. **类型转换操作符**:谨慎使用,可能导致类型安全问题。 29. **new操作符**:隐藏基类成员,确保明确意图。 30. **CLS-Compliant...

    mnist.pkl.gz数据文件

    pickle是一种用于序列化Python对象的库,它可以将Python对象转化为字节流,方便存储和传输。而gz则是gzip的压缩格式,用来减小文件大小,便于在网络上传输或节省存储空间。将MNIST数据集保存为pickle并进行gzip压缩...

    kinect获取彩色数据并用图片形式进行保存

    这涉及到创建一个新的图像对象,将Kinect的彩色数据赋值给它的像素,然后调用保存方法,指定文件格式(如JPEG、PNG等)和保存路径。 以下是一个简单的Python示例,展示了如何使用OpenCV来实现这一过程: ```python...

    2021-2022计算机二级等级考试试题及答案No.17606.docx

    10. 拷贝表结构:在SQL中,只拷贝表文件结构的命令通常是CREATE TABLE AS SELECT,但题目中给出的答案D可能是某个特定数据库系统的命令。 11. 数据库定义:数据库是一个以一定组织结构保存在辅助存储器中的数据集合...

    visio教程PDF

    7.4.3 把删除到内存中的对象拷贝到页面中 7.4.4 删除组中对象的方法 7.5 删除文本 7,6 删除页面 7.6.1 使用Edit Delete删除一页 7.6.2 使用DrawingExplore删除页面 7.7 小结 第8章 页面设置 ...

    Visio 2000 技术大全

    7.4.3 把删除到内存中的对象拷贝到页面中 7.4.4 删除组中对象的方法 7.5 删除文本 7,6 删除页面 7.6.1 使用Edit Delete删除一页 7.6.2 使用DrawingExplore删除页面 7.7 小结 第8章 页面...

    FullyConnected层1

    `import tensorrt as trt` 导入了TensorRT库,用于创建和构建神经网络模型。 2. **输入和输出定义**: `nIn, cIn, hIn, wIn = 1, 3, 4, 5` 定义了输入张量的维度,这里是一个形状为(N, C, H, W)的4D张量,其中N是...

    详解javascript常用工具类的封装

    \n对象处理方面,虽然没有具体给出示例,但通常会包含获取对象属性、深度拷贝、合并对象等方法,帮助开发者更好地操作和管理对象。\n时间日期处理方法通常包括格式化日期、计算时间差等功能,对于处理与时间相关的...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    其二、技术层次深:如果期望进入IT服务或者产品公司(类似毕博、DELL、IBM等),Oracle技术能够帮助提高就业的深度。 其三、职业方向多:Oracle数据库管理方向、Oracle开发及系统架构方向、Oracle数据建模数据仓库等...

    pytorch中tensor张量数据类型的转化方式

    本篇文章将详细探讨PyTorch中张量数据类型的转化方法,这对于理解和使用PyTorch进行深度学习至关重要。 1. **张量与NumPy数组的相互转换** PyTorch的张量与NumPy数组之间可以方便地相互转换。这使得我们可以在两...

    软件工程工资管理系统

    4 查询请求 系统管理员 应用系统 待查询对象识别符(如ID,编号) 5 查询结果 应用系统 系统管理员 被查询对象具体信息 6 管理请求 系统管理员 应用系统 识别符(ID,编号等)+管理类型 7 管理结果信息 应用系统 系统...

    C/C++程序员面试指南.杨国祥(带详细书签).pdf

    问题四:What leadership qualities did you develop as an administrative personnel? 问题五:How do you normally handle criticism? 问题六:What do you find frustrating in a work situation? 问题七:How...

Global site tag (gtag.js) - Google Analytics