2009-04-06 6 views
2

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

ответ

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

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

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

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

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) 
+0

Это страшное решение, любой объект просто укусил комплекс не будет скопирован правильно. Кроме того, добавление к прототипу объекта не является хорошей практикой. Я бы даже сказал, что добавление чего-либо к протипу - это плохая практика. Это больше, чем религия, чем функция. –

3

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

Ура!

+0

Если вы зарегистрируете псевдоним класса перед сериализацией, вы можете сохранить объект в нужном классе после десериализации. См. Flash.net.registerClassAlias – preaction

Смежные вопросы