2

应该很容易。我有一个对象。我想修改它,但在此之前我想保存一份我可以返回的副本。我尝试设置 copy = original 但是当我修改原始属性时,副本也会显示更改。我假设这是因为在您分配的任何时候在 actionscript 中,它实际上只是存储对原始对象的引用。那么我存储原始对象的副本以供以后使用的最佳方式是什么?

4

3 回答 3

3

您正在寻找的是对象的深层副本,而不是通过引用传递。我在这里找到了答案,它使用了 AS3 中的新 ByteArray 类:

http://www.kirupa.com/forum/showthread.php?p=1897368

function clone(source:Object):* {
 var copier:ByteArray = new ByteArray();
 copier.writeObject(source);
 copier.position = 0;
 return(copier.readObject());

}

然后你像这样使用它:

newObjectCopy = clone(originalObject);

干杯!

于 2009-04-06T01:36:07.900 回答
3
var newObj:Object = Object(ObjectUtil.copy(oldObj));

“复制指定的对象并返回对副本的引用。副本是使用本机序列化技术制作的。这意味着在复制期间将尊重自定义序列化。

此方法设计用于复制数据对象,例如集合的元素。它不适用于复制 UIComponent 对象,例如 TextInput 控件。如果要创建特定 UIComponent 对象的副本,可以创建组件的子类并实现 clone() 方法或其他方法来执行复制。”

http://livedocs.adobe.com/flex/3/langref/mx/utils/ObjectUtil.html#copy()

于 2009-04-06T03:33:04.860 回答
0
 // duplicate any given Object (not MCs)  
 Object.prototype.copy = function()  
 {  
     ASSetPropFlags(Object.prototype,["copy"],1);  

     var _t = new this.__proto__.constructor(this) //

     for(var i in this){  
         _t[i] = this[i].copy()  
     }  
     return _t  
 };  

用法

x = ["1","2","3",[4,5],[{a:1,b:2}]]

y = x.copy()

y[0] = 0

y[3][0]="d"

trace(x)

trace(y)
于 2009-04-06T01:26:08.907 回答