AS3 - клонировать объект - PullRequest
9 голосов
/ 11 декабря 2011

У меня есть игра с различными типами кораблей.Мой класс Ship имеет статический массив, содержащий один из каждого типа в нем.Всякий раз, когда я создаю новый Ship (кроме инициализации этого массива), я хочу сделать его клоном одного из существующих Ship объектов в моем массиве прототипов.

1 - Как я могу запуститьчерез все свойства в одном Ship объекте и назначить их второму Ship объекту?

2 - Как узнать, является ли свойство объектом или базовым типом, таким как String или int?Некоторые объекты в моем классе Ship необходимо клонировать, а некоторые - просто ссылки, которые должны оставаться неизменными.

Ответы [ 2 ]

19 голосов
/ 11 декабря 2011

Одним из вариантов, возможно, наиболее гибким, будет определение методов клонирования для каждого класса, который необходимо клонировать, например:

class Ship
{
    public var prop1:Number;
    public var otherClassInstance:OtherClass;
    public function clone():Ship
    {
        var result:Ship = new Ship();
        result.prop1 = this.prop1;
        result.otherClassInstance = this.otherClassInstance.clone()
    }
}

class OtherClass
{
    public var prop1:Number;
    public function clone():OtherClass
    {
        var result:OtherClass = new OtherClass();
        result.prop1 = this.prop1;
    }
}

Другой вариант - клонировать объект с помощью класса ByteArray, как показано в примере из документации Adobe:

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

Я видел случаи, когда этот подход не работает для клонирования экземпляров пользовательских классов, особенно для просмотра классов, таких как Sprites.

Другой подход заключается в использовании describeType из пакета flash.utils. С describeType вы можете перебирать свойства объекта.

Вот пример использования describeType для проверки свойств объекта, который является частью utils lib , который я написал.

Что касается проверки типа свойства, вы можете использовать describeType или оператор is, например, так:

if( myObj is SomeClass )
{

}

if( myObj is OtherClass )
{

}
4 голосов
/ 11 декабря 2011

Чтобы просмотреть все свойства одного объекта корабля и назначить их второму:

shipobj1:Ship = new Ship();
//set values for all shipobj1 properties

shipobj2:Ship = new Ship();

for (item in shipobj2)
    item = shipobj1[item];

Проверяя, является ли значение свойства объектом, вы можете использовать typeof.Ограничением является то, что возвращаются только 6 возможных типов: логическое значение, функция, число, объект, строка и xml.Так, например, если вам нужно знать, является ли свойство массивом, вы не можете сделать это с помощью typeof, так как это на самом деле вернет «объект», поскольку «массив» не является одним из 6 вариантов, но если вы простодля идентификации простых типов, таких как числа и строки, в отличие от других вещей, он должен выполнить свою задачу:

if(typeof item == "object")
  // do whatever with object
else if(typeof item == "string")
  // do whatever with string
//etc, etc.

РЕДАКТИРОВАТЬ: переменная "var" заменена на "item", поскольку var является зарезервированным словом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...