Flex对象的Clone & Copy浅析

在flex中有时候会用到ObjectUtil.clone和ObjectUtil.copy方法。下面是官方API的注释。

克隆指定对象,并返回对该克隆的引用。该克隆使用本机序列化技术生成。这意味着在克隆过程中将遵循该自定义的序列化。clone() 与 copy() 的不同之处在于,每个对象实例的 uid 属性会被保留。
该方法用于克隆数据对象,如集合的元素。不能用于克隆 UIComponent 对象,如 TextInput 控件。如果希望克隆特定的 UIComponent 对象,则可以创建该组件的一个子类,并实现 clone() 方法。
参数:
value 应克隆的对象。
返回:
指定对象的克隆。

 ObjectUtil.clone

复制指定对象并返回对该副本的引用。该副本使用本机序列化技术生成。这意味着在复制过程中将遵循该自定义的序列化。
该方法设计用于复制数据对象,如集合的元素。不能用于复制 UIComponent 对象,如 TextInput 控件。如果要创建特定 UIComponent 对象的副本,可创建该组件的子类并实现 clone() 方法,或执行复制的其他方法。
参数:
value 应复制的对象。
返回:
指定对象的副本。

ObjectUtil.copy

从官方的API解释中可以看出,这两个方法的区别之处在于clone方法,对象实例的uid属性会被保留
但是,我通过测试发现,clone和copy是没有什么区别的,copy方法也是会保留uid属性。下面是实
现IUID接口的实现类,类中包括了uid和title两个属性

  package
{
    import mx.core.IUID;

    public class AClass implements IUID
    {
        public function AClass()
        {
        }

        private var _uid:String;

        public function get uid():String
        {
            return _uid;
        }

        public function set uid(value:String):void
        {
            _uid = value;
        }


        private var _title:String;
        public function get title():String
        {
            return _title;
        }
        public function set title(value:String):void
        {
            _title = value;
        }
    }
}

测试代码:

var aclass:AClass = new AClass();
aclass.uid = "aaa";
aclass.title = "hello world";

var cloneA:Object = ObjectUtil.clone(aclass);

var key:String;
var count:int = 0;
for(key in cloneA){
    count ++;
    trace("cloneA : " + key + "->" + cloneA[key]);
}
trace(count);

count = 0;
var copyA:Object = ObjectUtil.copy(aclass);
for(key in copyA){
    count ++;
    trace("copyA : " + key + "->" + copyA[key]);
}
trace(count);

打印信息如下:

  • cloneA : title->hello world
  • cloneA : uid->aaa
  • 2
  • copyA : title->hello world
  • copyA : uid->aaa
  • 2
    打印结果是完全一样的。所以不知道是不是flex SDK的一个bug还是这用法不是这么用的。按照接口文档所说的
    应该是这样没错。
    使用clone或者copy只有是Array或者ArrayCollection时,克隆或复制的对象还是Array或ArrayCollection
    类型,如果是某个类生成的对象,克隆或复制的对象类型则变成Object类型。

  var ac:ArrayCollection = new ArrayCollection();
  var cloneAC:Object = ObjectUtil.clone(ac);
  trace(cloneAC is ArrayCollection);//true

  var aclass:AClass = new AClass();
  aclass.uid = "aaa";
  aclass.title = "hello world";
  var cloneA:Object = ObjectUtil.clone(aclass);
  trace(cloneA is AClass); // false
  

如果想复制原来对象并且是原来的类的可以通过下面方法解决


    /**
    * 通过这个修改后的克隆方法,便可以克隆元对象类型的新对象了
    * @param clazz 要克隆对象的类,该类必须导入应用程序中,否则报错,类最后命名空间要全;如com.test.AClass
    * @param source 要克隆的对象
    * @param exclude 要排除的属性集合
    */
    public static function clone(clazz:Class,source:Object,exclude:Array = null):Object{
                var result:Object = new clazz();
                                if(source == null) return null;
                function isIn(value:*,sourceArray:Array):Boolean{
                    if(sourceArray != null){
                        for(var i:int = 0;i<sourceArray.length;i++){
                            if(sourceArray[i] == value){
                                return true;
                            }
                        }
                    }
                     return false;
                }
                for(var key:String in source){
                    if(isIn(key,exclude)){
                        continue ;
                    }else{
                        result[key] = source[key];
                    }
                }
                return result;
            }

转载于:https://www.cnblogs.com/muzizone/p/4718650.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值