首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

在AS3中,怎么实现数组及对象的深拷贝

2012-08-27 
在AS3中,如何实现数组及对象的深拷贝?var t2 :TextFieldSprite t1.clone() as TextFieldSpritetrace(t2

在AS3中,如何实现数组及对象的深拷贝?
var t2 :TextFieldSprite = t1.clone() as TextFieldSprite;trace(t2.getText());//TextFieldSprite 1t2.setText( "TextFieldSprite 2" );trace(t2.getText());//TextFieldSprite 2addChild( t2 );t2.y = t1.height;

实例化一个显示对象数组,这时候便不能使用concat或slice复制数组了,须使用for关键字自行实现复制逻辑,示例如下:

var arr1 : Array = [new TextFieldSprite(), new TextFieldSprite()];var arr2 :Array = new Array(arr1.length);var n :int = arr1.length;for(var j:int=0; j<n; j++){arr2[j] = arr1[j].clone();arr2[j].setText( "TextFieldSprite " + j);}arr2.concat(arr1).forEach(function(item :DisplayObject, index :int=-1, arr :Array = null) :void{addChild(item);item.y = index * item.height;});

for关键字在这里是可以保证遍历所有数组元素的,可以使用。运行效果图如下:

?

6,使用原型扩展Array

每次在拷贝数组时,均使用for循环复制数组元素是一件很麻烦的事情,如果Array本身具有一个clone方法该有多好。AS3作为一门支持prototype的语言,可以在Array上扩展出clone方法,示例代码如下:

Array.prototype.clone = function() :Array{var r :Array = new Array(this.length);for(var j:int; j<this.length; j++){r[j] = this[j].clone();}return r;};var arr1 : Array = [new TextFieldSprite(), new TextFieldSprite()];var arr2 :Array = arr1.clone();arr2.concat(arr1).forEach(function(item :DisplayObject, index :int=-1, arr :Array = null) :void{addChild(item);item.y = index * item.height;});

?

7,AS3中深拷贝最佳实践

如果你在使用Gumbo进行项目开发,Adobe在mx.utils.ObjectUtil中提供了两个深拷贝对象的方法:

1) copy

该方法使用ByteArray实现,与前面的clone方法的实现原理一致。该方法可用于深拷贝非复合并且非由Flash Player定义的对象。

2) clone

该方法内嵌了copy方法调用,可用于深拷贝copy不支持的复合对象,但也不能拷贝由Flash Player定义的显示对象。这个方法不能在数字for循环中调用,因为它是耗费用户CPU的操作,使用它要注意节约。

如果你不在使用Gumbo开发,按上面的方法实现ICloneable接口,然后使用for循环复制到新数组元素。使用prototype扩展clone方法并非明智之举!

为什么说使用prototype扩展clone方法并非明智之举?

8,问题

1)在AS3中有哪些对象作为数组元素时,是引用类型?

2)为什么说for不能保证遍历数组的所有元素?

3)为什么在AS3中不能使用ByteArray拷贝显示对象?使用它拷贝出来的对象为什么不能转换为DisplayObject?

4)为什么说使用prototype扩展clone方法并非明智之举?

热点排行