欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Flex 深复制 浅复制

程序员文章站 2022-05-05 12:09:09
...

对于基本类型,无所谓深浅复制。

深浅复制只要是对于引用类型来说的。一句话概括来说就是:引用类型是否指向了新的内存地址。

例如对于数组来说,因为数组不是类型化数组,所以你可以往数组里面放置基本类型数据和引用类型数据,对于包含引用类型的数据的数组,讨论才有意义。

 

var array:Array = [1,2,3,{name:"kenny"}];
var shallowCopyArray:Array = array.concat();
var cloneArray:Array = ObjectUtil.clone(array) as Array;

 对于浅复制,shallowCopyArray最后一个元素和原始数组最后一个元素的引用地址是一样;

 

 对于深复制,cloneArray的最后一个元素和原始数组最后一个元素的引用地址是不一样;

内容地址的不一样,导致你操作的是否是同一个对象。

 

对于自定义对象的复制,譬如说自己提供一个clone()方法提供自身的复制对象。一般来说涉及到原型模式。

如果自定义对象中包含了另一个对象(自定义的),在你复制自身之前,需要做一些事情,不然它复制出来的对象就是一个Object啦,而非你自定义的对象。

App:

 

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
			   xmlns:s="library://ns.adobe.com/flex/spark" 
			   xmlns:mx="library://ns.adobe.com/flex/mx" 
			   minWidth="955" minHeight="600"">
	<fx:Script>
		<![CDATA[
			import com.mode.clone.Company;
			import com.mode.clone.Person;
			protected function button1_clickHandler(event:MouseEvent):void
			{
			 	var person:Person = new Person();
				person.name = "kenny";
				var company:Company = new Company();
				company.name = "lomboard";
				person.company = company;
				var clonePerson:Person = person.clone();
				// 去查看下clonePerson中的company是否是一个Company对象还是一个Object
			}
		]]>
	</fx:Script>
	<s:Button click="button1_clickHandler(event)"/>
</s:Application>

 Person:

 

package com.mode.clone
{
	import flash.net.registerClassAlias;
	import mx.collections.ArrayCollection;
	import mx.utils.ObjectUtil;
	public class Person
	{
		public var name:String;
		public var company:Company;//另一个自定义对象
		public function clone():Person
		{
			registerClassAlias("com.mode.clone.Company",Company);//对一个对象进行编码时,保留该对象的类(类型)。
			registerClassAlias("com.mode.clone.Person",Person);
			//如果没有上面的编码,你就不能强制转换为person
			return ObjectUtil.copy(this) as Person;
		}
	}
}

 Company:

package com.mode.clone
{
	public class Company
	{
		public var name:String;
	}
}