闪无忧
 
首 页 业界新闻 业界杂谈 Flash教程 Flash源码 Flash图书 Flash酷站 Flex & AIR 供求信息
   本栏目通告:   有意向写收费精品教程的朋友,请联系本站合作
当前位置 :首页>flash教程>Flash as程序>列表

AS3深度克隆

[来源: | 作者:wwj_as3  | 时间:2010-04-29 | 点击:  | 收藏本文  【 】]
5uflash文章摘要:最近有点儿时间,帖点儿小经验给大家.有不妥之处敬请包涵. 用byteArray克隆对象,估计大家大多数都用过.应该是类似下面的实现 var copier:ByteArray = new ByteArray();             copier.writeObject(source)

最近有点儿时间,帖点儿小经验给大家.有不妥之处敬请包涵.
用byteArray克隆对象,估计大家大多数都用过.应该是类似下面的实现

var copier:ByteArray = new ByteArray();
            copier.writeObject(source);
            copier.position = 0;
            return copier.readObject();

但对于一个相当复杂的对象,要达到完全克隆,还面临着很多问题.
比如下面这几种情况:
1:属性是自定义类型
2.属性是数组,而且数组元素是自定义类型
3.属性是接口形式,但现实是某种实现
4.属性是Dictionary
等等.不知道大家是否碰到过这样的情况.
所以经过研究,对上面的方法进行了一些拓展.形成了下面这种方式进行克隆.

private static function regtype(tn:String):void {
            if (tn == null || tn == "null" || tn == "int" || tn == "string" || tn == "Number" || tn == "String" || tn == "Boolean" || tn == "Object")return;
            var type:Class;
            try {
                type = getClassByAlias(tn);
            } catch(err:Error) {
            }
            if (type != null)return;
            try {
                type = Class(getDefinitionByName(tn));
            } catch(err:Error) {
                return;
            }
            if (type == null)return;
            registerClassAlias(tn, type);
        }

        private static function registerClass(source:*):void {
            var tn:String = getQualifiedClassName(source);
            regtype(tn);
            if(tn=="Array"||tn=="flash.utils::Dictionary"){
                for(var ele:String in source){
                    registerClass(source[ele]);
                }
            }
            var dxml:XML = describeType(source);
            for each(var acc:XML in dxml.accessor) {
                registerClass(source[acc.@name]);
            }
            for each(var acc1:XML in dxml.variable) {
                registerClass(source[acc1.@name]);
            }
            for each(var acc2:XML in dxml.implementsInterface) {
                regtype(acc2.@type);
            }
            regtype(dxml.extendsClass.@type);
        }

        public static function baseClone(source:*):* {
            registerClass(source);
            var copier:ByteArray = new ByteArray();
            copier.writeObject(source);
            copier.position = 0;
            return copier.readObject();
        }

其中baseClone是入口方法,其余两个做辅助工作.具体原理是:
1.用describeType方法对原始对象进行结构分析
2.把原始对象的复杂属性注册别名
3.递归进行2操作.


文章如果有错误或者缺少文件,请发邮件提交给我们
上一篇:AS中用到的键控代码
下一篇:Flash CS5中使用新AS3 TLF文本类
>>> 最新评论:(共有 0 位网友发表了评论)      查看所有评论
  发表评论
用户名: 新注册) 密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
·本站发布内容均为客观表达作者观点,不代表闪无忧立场,请勿攻击和漫骂
·用户发表意见仅代表其个人意见,并且承担一切因发表内容引起的纠纷和责任
·本站管理人员有权在不通知用户的情况下删除不符合规定的评论信息或留做证据
·请客观的评价您所看到的资讯,提倡就事论事,杜绝漫骂和人身攻击等不文明行为
  教程分类
  基础操作   动画特效
  应用开发   组件学习
  As程序   动画教程
  Flash cs3   AS 3.0
  FCS/FMS教程   Loading教程
  Flash与Web   Flash教程连载
  Flash 3d
  相关文章
·flash中7个Trim()的等效方法
·AS3文档类打造绚烂星形变幻效果
·Flash CS5中使用新AS3 TLF文本类
·AS3深度克隆
·AS中用到的键控代码
·用flash创建一个复制功能键
·AS3 atan与atan2函数区别
·DateTimeAxis高级应用
·flash player 10预览本地图片并
·关于载入外部swf传参数或者共享
  热门文章
·Flash进度条的制作详细讲解(组图)
·Flex 3 AdvancedDataGrid的使用(第二
·全Flash动画网站实现的基础教学
·FLASH+XML相册(附源码)
·FLV播放器汇总
·flash幻灯片网页效果
·超酷flash光晕移动效果
·Flash打造简单的飘雪动画视觉特效
·flash水影效果字
·flash春雷闪电效果
·Flash制作大雪纷飞效果动画
关于我们 - 免责声明 - 网站地图 - 商务服务 - 联系我们 - RSS地图
©CopyRight 2006-2008, 5UFlash.COM, Inc. All Rights Reserved
鲁ICP备06034971号