在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方法并非明智之举?