Thursday, April 28, 2011

Actionscript - Variable Assignment without reference?

Should be easy. I have an object. I want to modify it, but before i do I want to save a copy of it that I can go back to. I tried setting copy = original but when i modify the attributes of the original the copy also shows the changes. I am assuming this is because in actionscript any time you assign, it really just stores a reference to the original object. So whats the best way for me to store a copy of the original object for later use?

From stackoverflow
  •  // 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  
     };
    

    Usage

    x = ["1","2","3",[4,5],[{a:1,b:2}]]
    
    y = x.copy()
    
    y[0] = 0
    
    y[3][0]="d"
    
    trace(x)
    
    trace(y)
    
    Lillemanden : This is a terrible solution, any object just bit complex would not be copied properly. Furthermore adding to the Object prototype is not good practice. I would even go as far as to say adding anything to the protype is bad practice. It's more a left over relic than a feature.
  • What you are looking for is a deep copy of the object rather then passing by reference. I found the answer here which uses the new ByteArray class in AS3:

    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());
    

    }

    Which you then use like this:

    newObjectCopy = clone(originalObject);
    

    Cheers!

  • var newObj:Object = Object(ObjectUtil.copy(oldObj));
    

    "Copies the specified Object and returns a reference to the copy. The copy is made using a native serialization technique. This means that custom serialization will be respected during the copy.

    This method is designed for copying data objects, such as elements of a collection. It is not intended for copying a UIComponent object, such as a TextInput control. If you want to create copies of specific UIComponent objects, you can create a subclass of the component and implement a clone() method, or other method to perform the copy."

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

0 comments:

Post a Comment