Một lựa chọn, cho là nhanh nhẹn nhất, sẽ được xác định phương pháp clone cho mỗi lớp mà bạn cần phải sao chép, chẳng hạn như:
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;
}
}
Một lựa chọn khác là để sao chép một đối tượng bằng cách sử dụng các lớp ByteArray như ví dụ này từ tài liệu Adobe:
function clone(source:Object):*
{
var myBA:ByteArray = new ByteArray();
myBA.writeObject(source);
myBA.position = 0;
return(myBA.readObject());
}
Tôi đã thấy các trường hợp phương pháp này không hoạt động để sao chép các cá thể của lớp tùy chỉnh, đặc biệt xem các lớp như Sprites.
Cách tiếp cận khác là sử dụng describeType
từ gói flash.utils
. Với describeType
bạn có thể lặp qua các thuộc tính của một đối tượng.
Dưới đây là ví dụ về cách sử dụng describeType
để kiểm tra các thuộc tính của đối tượng là một phần của utils lib Tôi đã viết.
Đối với việc kiểm tra các loại tài sản, bạn có thể sử dụng describeType
hoặc bạn cũng có thể sử dụng toán tử is
như thế này:
if(myObj is SomeClass)
{
}
if(myObj is OtherClass)
{
}
Tôi nghĩ rằng tôi sẽ phải làm đề nghị đầu tiên của bạn, mặc dù điều này có vấn đề nếu tôi thêm các biến mới vào các lớp học của tôi, tôi sẽ phải thêm dòng mới để nhân bản() mỗi lần. –
Điều đó cũng có lợi thế. Có lẽ bạn có thể muốn đặt một giá trị mặc định nếu không có giá trị nào được đặt hoặc bạn có thể muốn sao chép một số đạo cụ và không phải là một số giá trị khác. Một cách tiếp cận tự động bằng cách sử dụng describeType sẽ không quá linh hoạt. – JeremyFromEarth