今天同事问我有as3中对象深度拷贝的问题
原来还真是没用过,今天google后自己总结下,便于大家参考
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
分享到:
相关推荐
### 通过ByteArray播放MP3的方法解析 在Adobe Flash平台中,使用`ByteArray`来加载并播放MP3文件是一项常见的需求,尤其是在需要动态加载音频资源的应用场景下。本文将详细介绍如何利用ActionScript 3 (AS3) 语言...
3. **Sound**: AS3中的一个类,表示声音对象,可以加载、播放和控制音频。 4. **MP3**: 常见的音频压缩格式,广泛用于网络音频传输。 在Flex中,我们可以使用以下步骤将ByteArray转换为Sound: **步骤1:创建Sound...
综上所述,这个压缩包文件主要涵盖了AS3中与字符编码转换相关的知识,包括`ByteArray`对象的`writeMultiByte()` 和 `readMultiByte()` 方法,以及AS3中的字符串默认使用UTF-16编码,Socket通信中默认使用UTF-8编码等...
在AS3中,我们通常使用String或ByteArray对象来处理16进制数据。`HEXtoString as3.as`这个文件可能包含一个函数,用于将16进制字符串转换为ByteArray,以便于Socket通信。 在AS3中,使用Socket类的步骤如下: 1. *...
通过`JSON.parse()`方法,你可以将一个JSON格式的字符串转换为AS3的对象结构,而`JSON.stringify()`则可以将AS3对象转换为JSON字符串,方便数据在网络间的传输。例如: ```actionscript var jsonString = '{"name":...
在 AS3 中读取 ANSI 文本时,经常会出现中文乱码的问题。这是因为 AS3 在读取 ANSI 文本时,默认使用的编码方式是 System.useCodePage=false,这导致了中文乱码的问题。为了解决这个问题,我们可以使用 ByteArray ...
这个类并不内置于标准的AS3库中,但可以通过第三方库,如Zamzar或AS3CoreLib来获取。这些库提供了一个`encode()`方法,用于将BitmapData对象转换为PNG数据。 AS3CoreLib是一个流行的ActionScript库,包含许多实用...
标题中的“renlianshibie.rar_FlashAS3人脸识别_as3_as3 人脸_flash as3_flash人脸”揭示了我们讨论的主题是关于使用Flash AS3实现的人脸识别技术。这一技术结合了ActionScript 3(AS3)编程语言与OpenCV库中的Haar...
在ActionScript 3 (AS3)中,录音并保存为文件是一个涉及音频处理和文件I/O操作的过程。本文将深入探讨如何使用AS3实现这一功能,主要包括以下知识点: 1. **麦克风访问**:在AS3中,可以使用`Microphone`类来获取...
AS3 ZIP和AS3 GZIP是两个常用的类库,它们允许开发者在Flash环境中对数据进行压缩和解压缩,从而优化文件传输和存储效率。下面我们将详细探讨这两个类库及其在实际应用中的用法。 首先,我们来看`ZipArchive`,这是...
AS3拍照程序是一种基于Adobe Flash CS6开发的交互式应用程序,它允许用户通过网页或桌面应用进行模拟拍照体验。ActionScript 3(AS3)是Flash平台的核心编程语言,为这个程序提供了强大的功能和灵活性。 在AS3中,...
在本文中,我们将深入探讨如何使用ActionScript 3(AS3)在Flash环境中调用摄像头并保存捕获的图像为JPEG格式。ActionScript是Adobe Flash Professional和Flash Builder中用于创建交互式内容的主要编程语言,而AS3是...
在ActionScript 3 (AS3)中,动态加载字体是一种技术,允许开发者在应用程序运行时加载和使用新的字体。这可以极大地提高应用的灵活性,尤其是对于那些需要展示各种独特字体或者用户可定制字体的应用。本知识点将深入...
在本文中,我们将深入探讨如何使用ActionScript 3 (AS3) 来读取MP3文件中的ID3元数据。ID3是音频文件格式,尤其是MP3文件中用于存储歌曲信息的标准,包括艺术家名、歌曲标题、专辑名、歌词等。AS3是Adobe Flex和...
在AS3中使用`Socket`,首先要导入`flash.net.Socket`和`flash.utils.ByteArray`这两个类。`Socket`类用于建立和管理TCP连接,而`ByteArray`则用于读写二进制数据,这是TCP通信的基础。 创建Socket连接的基本步骤...
标题中的“Flex 与 Struts2 ByteArray 数据上传”指的是在Web开发中,使用Adobe Flex作为前端客户端,通过Struts2框架在后端处理字节数组(ByteArray)数据的上传技术。Flex是一种基于Adobe Flash Player或Adobe AIR...
在AS3(ActionScript 3)中,将PNG图片转换为二进制数据是一种常见的优化图像加载和显示的方法。这主要是因为二进制数据能够更有效地处理和传输,特别是对于大量图片的应用,如游戏或者多媒体项目。以下是关于这个...
收到服务器返回的加密或解密后的ZIP数据后,可以使用AS3的`ByteArray`类进行进一步处理,如保存到本地或展示给用户。 为了提高安全性,还可以考虑使用HTTPS协议进行通信,以保护数据在传输过程中的安全。同时,密钥...
5. **编码和解码**:由于SMTP协议通常要求数据使用Base64编码,所以你可能需要使用AS3的` flash.utils.ByteArray`类进行编码和解码。 6. **错误处理**:SMTP服务器可能会返回各种错误代码,我们需要正确地处理这些...
5. **ByteArray到Bitmap转换**:最后,将组合后的Bitmap再转换回ByteArray,以便后续使用,或者可以直接在内存中进行渲染。 这种方法的优点在于,由于只处理和显示需要的部分,可以显著减少内存占用,提高性能。...