Có cách nào để có được những kiểu thời gian chạy thực tế?
Có.
var actualRuntimeType:Class = Object(yourInstance).constructor;
Một số câu trả lời khác đã tham khảo .constructor
, nhưng bạn có thể không phải lúc nào truy cập trực tiếp .constructor
trong ActionScript 3.Nó chỉ có thể truy cập trên dynamic
lớp học, mà hầu hết các lớp học thì không. Cố gắng sử dụng nó trên một lớp thông thường sẽ gây ra một lỗi biên dịch theo các thiết lập mặc định.
Tuy nhiên, vì mỗi lớp được kế thừa từ Object
, là dynamic
, chúng tôi có thể tra cứu tài sản .constructor
của chúng tôi chỉ bằng cách truyền một phiên bản thành Object
.
Vì vậy nếu chúng ta không quan tâm đến các lớp con, chúng ta có thể xác nhận rằng hai trường hợp là chính xác cùng lớp bằng cách đơn giản đánh giá này:
Object(instanceA).constructor === Object(instanceB).constructor;
Tôi đã học được điều này từ bài "Get the class used to create an object instance in AS3" bởi Josh Tynjala .
Một thay thế thậm chí đơn giản hơn mà cũng làm việc cho tôi chỉ là:
var actualRuntimeType:Class = yourInstance["constructor"];
Thời gian chạy là hoàn toàn có khả năng đem lại cho bạn những .constructor
, nó chỉ là trình biên dịch phàn nàn nếu bạn sử dụng cú pháp đó. Sử dụng ["constructor"]
nên sản xuất cùng một bytecode, nhưng trình biên dịch không đủ thông minh để ngăn bạn.
Tôi đã bao gồm điều này vì nó chưa được kiểm tra ở bất kỳ đâu ngoại trừ môi trường Flash hiện tại của tôi, trong khi một số người dùng đã nói rằng phương pháp được mô tả ở trên hoạt động cho họ.
Nguồn
2013-02-14 21:46:47
Bạn sẽ nghĩ rằng đây sẽ là hành vi mặc định, nhưng ActionScript biết ... tốt hơn? –
tôi tin rằng 'getQualifiedClassName' chậm hơn toán tử' is'. tuy nhiên, nó cũng cho phép so sánh với các chuỗi thay vì các lớp, có thể hữu ích để tránh việc biên dịch các lớp mà bạn không sử dụng (nhưng vẫn có thể kiểm tra các kiểu đối tượng). – ericsoco