ГлавнаяActionScript 3 — «100 советов» › Полное Копирование объекта

Полное Копирование объекта

June 19th, 2006
С помощью класса ByteArray, мы можем копировать полностью объекты. Под полным копированием имеется ввиду, что мы можем копировать так же “дочерние” объекты копируемого объекта, и так далее. Например если у нас есть массив с объектами, и мы копируем его, то кроме самого массива скопируются и объекты.

Пример функции:

Код:
import flash.utils.ByteArray; function clone(source:Object):* { var copier:ByteArray = new ByteArray(); copier.writeObject(source); copier.position = 0; return(copier.readObject()); }

Использование:

Код:
newObjectCopy = clone(originalObject);

Nirth: Информация о классе не сохраняется, но мы можем воспользоватся кастингом:

Код:
package { import flash.display.*; import flash.utils.*; dynamic public class Test extends Sprite { public function Test() { var user:UserInfo = new UserInfo(); user.name = "David"; user.email = "david@david.com"; user.page = new HomePage(); user.page.title = "David"; user.page.url = "david.com"; trace("user class name:",getQualifiedClassName(user)); trace("user.page class name:",getQualifiedClassName(user.page)); var user2:UserInfo = clone(user) as UserInfo; trace("user2 class name:",getQualifiedClassName(user)); trace("user2.page class name:",getQualifiedClassName(user.page)); } private function clone(source:Object):* { var copier:ByteArray = new ByteArray(); copier.writeObject(source); copier.position = 0; return(copier.readObject()); } } } class UserInfo { internal var name:String; internal var email:String; internal var page:HomePage; public function UserInfo() { } } class HomePage { internal var url:String; internal var title:String; public function HomePage() { } }

Данный метод хорошо подходит для чистых DTO/VO объектов.

Категория: ActionScript 3 — «100 советов» Ярлыки: ,

Смотрите также

Подход к сортировке глубин Одинаковые имена свойств
  1. Игорь
    May 30th, 2010 at 10:56 | #1

    Не копирует к сожалению стандартные классы:

    TypeError: Error #1034: Type Coercion failed: cannot convert Object@5022c11 to flash.display.Loader.
    at _fla::MainTimeline/sozdatMassiv()[_fla.MainTimeline::frame2:84]
    Тестирование ролика прервано.

    Кно нибудь знает, как скопировать MovieClip допустим???????????????????????????????????????????????

  2. cermic
    December 14th, 2010 at 11:42 | #3

    оператор as возвращает null даже для собственно определённых классов. Т.е. этот код у меня не работает, почему то. Хотя к свойствам объекта, возвращаемого методом clone(), обращается нормально.

  3. cermic
    December 14th, 2010 at 12:11 | #4

    прикол
    trace(“user2 class name:”,getQualifiedClassName(user));
    trace(“user2.page class name:”,getQualifiedClassName(user.page));

    а разве суть примера не в том чтоб работало
    trace(“user2 class name:”,getQualifiedClassName(user2));
    trace(“user2.page class name:”,getQualifiedClassName(user2.page));

  1. Пока нету.