在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;
}

Flex对象的Clone & Copy浅析的更多相关文章

  1. Java基础——clone()方法浅析

    一.clone的概念 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象.那 ...

  2. 探究@property申明对象属性时copy与strong的区别

    一.问题来源 一直没有搞清楚NSString.NSArray.NSDictionary--属性描述关键字copy和strong的区别,看别人的项目中属性定义有的用copy,有的用strong.自己在开 ...

  3. Ruby中如何复制对象 (deep clone)(转载)

    Ruby中如何复制对象 (deep clone) 用Ruby复制一个对象(object)也许没有你想像的那么容易. 今天我google了半天, 做个总结吧. 先从最简单的开始, b = a 是复制吗? ...

  4. Javascript对象拷贝(clone)

    Javascript对象拷贝(clone),希望大家给点建议​1. [代码]方法代码 function cp(source, target) {    function isBaseType(v) { ...

  5. java Object对象的clone方法

    参考copy链接:http://blog.csdn.net/bigconvience/article/details/25025561 在看原型模式,发现要用到clone这个方法,以前和朋友聊过,没怎 ...

  6. C++中实现对象的clone()

    在C#中,许多对象自动实现了clone函数,在C++中,要拷贝一个对象,除了自定义一个拷贝构造函数来实现对象复制外,还可以像C#中那样实现一个clone函数,这需要借助编译器实现的一个隐藏拷贝构造函数 ...

  7. 关于:1.指针与对象;2.深浅拷贝(复制);3.可变与不可变对象;4.copy与mutableCopy的一些理解

    最近对深浅拷贝(复制)做了一些研究,在此将自己的理解写下来,希望对大家有所帮助.本人尚处在摸索阶段,希望各位予以指正. 本文包括如下方向的探索: 1.指针与对象: 2.深/浅拷贝(复制): 3.可变/ ...

  8. [H5]range对象的clone方法

    clone:range对象的克隆; <body> <p id="p">这是一段文字</p> <button onclick="b ...

  9. java 浅拷贝和深拷贝 对象克隆clone

    分一下几点讨论: 为什么要克隆? 如何实现克隆 浅克隆和深克隆 解决多层克隆问题 总结 一:为什么要克隆? 大家先思考一个问题,为什么需要克隆对象?直接new一个对象不行吗? 答案是:克隆的对象可能包 ...

随机推荐

  1. Python基础教程【读书笔记】 - 2016/6/26

    希望通过博客园持续的更新,分享和记录Python基础知识到高级应用的点点滴滴! 第一波:第6章  抽象 [总览] 介绍函数.参数parameter.作用于scope概念,以及递归概念. [6.1] 函 ...

  2. bzoj1201: [HNOI2005]数三角形

    Description Input 大三角形的所有短边可以看成由(n+1)*n/2个单位三角形的边界组成.如下图的灰色三角形所示.其中第1排有1个灰色三角形,第2排有2个灰色三角形,……,第n排有n个 ...

  3. 使用express搭建第一个Web应用【Node.js初学】

    来源:http://jingyan.baidu.com/article/bad08e1ee501e009c8512106.html express是一个开源的node.js项目框架,初学者使用expr ...

  4. C基础--函数指针的使用

    之前在看代码的时候,看了函数指针的使用,大体分为如下几类: 做一个function list,通过指针索引调用,使得处理功能类似的函数看起来更加清晰: 函数指针作为另一个函数的参数,用作回调: lin ...

  5. 【Linux】之shell特殊变量整理

    目录 1. 特殊变量列表 2. 特殊说明 在shell中变量名只能包含数字.字母和下划线,因为某些包含其他字符的变量有特殊含义,这样的变量被称为特殊变量. 例如,$ 表示当前Shell进程的ID,即p ...

  6. 一个Oracle触发器的示例

    CREATE OR REPLACE TRIGGER WoStateChange AFTER UPDATE on csdbuser.T_PD_WorkOrder for each row declare ...

  7. 黄聪:VPS实现自动定时备份网站数据以及Mysql数据库到百度云同步盘

    建站多了,备份成了头疼的问题,因为你不知道你的VPS什么时候会宕机或者服务商跑路,一旦网站数据丢失,那么相当于前功尽弃了,所以自己研究出了一套自动备份的方法. 需要的东西: 1.一个VPS(虚拟空间没 ...

  8. 使用 Entity Framework

    ORM 和 EF 当我们要开发一个应用程序,就要考虑怎样展示数据,怎样持久化数据.考虑这个问题时我们所要关心的东西,最重要的莫过于程序的性能.开发的简易性和代码的可维护.可扩展性. 持久化(Persi ...

  9. 让 SVN (TortoiseSVN)提交时忽略bin和obj目录

    2013-06-23 更新 后来我使用属性来过滤,结果反而没有效果了,之后我再次尝试使用全局忽略样式设置:*/bin */obj */packages 结果又有效果了,奇怪了. ------- 由于我 ...

  10. SparkSQL项目中的应用

    Spark是一个通用的大规模数据快速处理引擎.可以简单理解为Spark就是一个大数据分布式处理框架.基于内存计算的Spark的计算速度要比Hadoop的MapReduce快上100倍以上,基于磁盘的计 ...