Actionscript - присвоение переменной без ссылки? - PullRequest
2 голосов
/ 06 апреля 2009

Должно быть легко. У меня есть объект. Я хочу изменить его, но перед тем, как сделать это, я хочу сохранить его копию, к которой я могу вернуться. Я попытался установить копию = оригинал, но когда я изменяю атрибуты оригинала, копия также показывает изменения. Я предполагаю, что это потому, что в ActionScript каждый раз, когда вы назначаете, он просто хранит ссылку на исходный объект. Так какой же лучший способ для меня сохранить копию исходного объекта для последующего использования?

Ответы [ 3 ]

3 голосов
/ 06 апреля 2009

То, что вы ищете, это глубокая копия объекта, а не передача по ссылке. Я нашел ответ здесь, который использует новый класс ByteArray в 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());

}

Который вы затем используете следующим образом:

newObjectCopy = clone(originalObject);

Ура!

3 голосов
/ 06 апреля 2009
var newObj:Object = Object(ObjectUtil.copy(oldObj));

"Копирует указанный Объект и возвращает ссылку на копию. Копия сделана с использованием собственной технологии сериализации. Это означает, что во время копирования будет соблюдаться пользовательская сериализация.

Этот метод предназначен для копирования объектов данных, таких как элементы коллекции. Он не предназначен для копирования объекта UIComponent, такого как элемент управления TextInput. Если вы хотите создать копии определенных объектов UIComponent, вы можете создать подкласс компонента и реализовать метод clone () или другой метод для выполнения копирования. "

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

0 голосов
/ 06 апреля 2009
 // 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)
...