2010-05-02 49 views
27

Tôi đang cố đọc một thuộc tính trên một loạt các Sprites. Thuộc tính này có thể có hoặc không có mặt trên các đối tượng này, và thậm chí có thể không được khai báo, tệ hơn là null.Làm cách nào để kiểm tra xem một thuộc tính có tồn tại trên một đối tượng trước khi đọc giá trị của nó không?

Mã của tôi là:

if (child["readable"] == true){ 
    // this Sprite is activated for reading 
} 

Và như vậy Flash hiển thị tôi:

Lỗi # 1069: tài sản có thể lựa chọn không tìm thấy trên flash.display.Sprite và không có giá trị mặc định.

Có cách nào để kiểm tra xem một thuộc tính có tồn tại trước khi đọc giá trị của nó không?

Cái gì như:

if (child.isProperty("readable") && child["readable"] == true){ 
    // this Sprite is activated for reading 
} 

Trả lời

53

Đối tượng trong AS3 có phương pháp hasOwnProperty mà phải mất một đối số chuỗi và trả về true nếu đối tượng đã có tài sản quy định.

if(myObj.hasOwnProperty("someProperty")) 
{ 
    // Do something 
} 
0

Hãy thử một cái gì đó như thế này:

if (child["readable"] != null){ 

} 
+4

điều này có thể gây ra lỗi nếu nó không tồn tại ở nơi đầu tiên. bạn sẽ thấy lỗi nếu bạn đang tạo một đối tượng động như tìm kiếm ["b"] trong 'var a: Object = {a: '1'}' – Daniel

+0

(Điều này không hoạt động) – Lego

+0

var a; a = a {a: 1}; dấu vết (a ["b"]), kết quả đầu ra "không xác định", nhưng không tạo ra bất kỳ lỗi nào. Vì vậy, vấn đề khi sử dụng theo cách này? –

17
if ("readable" in child) { 
    ... 
1

Thêm này vì nó là một phản ứng hàng đầu trong Google.

Nếu bạn đang cố gắng để kiểm tra xem một hằng số tồn tại sử dụng một chuỗi cho tên sau đó sử dụng

if (ClassName["ConstName"] !== undefined) { 
    ... 
} 
0

Response to @Vishwas G (không phải là một bình luận bởi vì mã khối không được hỗ trợ trong ý kiến):

Như Daniel đã chỉ ra, nếu đối tượng "a" trong ví dụ của bạn không tồn tại ở nơi đầu tiên, nỗ lực của bạn để truy cập "b" trên "a" sẽ gây ra lỗi. Điều này xảy ra trong trường hợp bạn đang mong đợi một cấu trúc sâu, chẳng hạn như một đối tượng JSON có thể, ví dụ, có định dạng "content.social.avatar". Nếu "xã hội" không tồn tại, sau đó cố truy cập "content.social.avatar" sẽ gây ra lỗi.

Dưới đây là một ví dụ tổng hợp cụ thể của một sâu cấu trúc bài thi sở hữu tồn tại nơi cách tiếp cận "không xác định" có thể gây ra một lỗi trong trường hợp "hasOwnProperty()" cách tiếp cận không:

// Missing property "c". This is the "invalid data" case. 
var test1:Object = { a:{b:"hello"}}; 
// Has property "c". This is the "valid data" case. 
var test2:Object = { a:{b:{c:"world"}}}; 

Bây giờ các bài kiểm tra ...

// ** Error ** (Because "b" is a String, not a dynamic 
// object, so ActionScript's type checker generates an error.) 
trace(test1.a.b.c); 
// Outputs: world 
trace(test2.a.b.c); 

// ** Error **. (Because although "b" exists, there's no "c" in "b".) 
trace(test1.a && test1.a.b && test1.a.b.c); 
// Outputs: world 
trace(test2.a && test2.a.b && test2.a.b.c); 

// Outputs: false. (Notice, no error here. Compare with the previous 
// misguided existence-test attempt, which generated an error.) 
trace(test1.hasOwnProperty("a") && test1.a.hasOwnProperty("b") && test1.a.b.hasOwnProperty("c")); 
// Outputs: true 
trace(test2.hasOwnProperty("a") && test2.a.hasOwnProperty("b") && test2.a.b.hasOwnProperty("c")); 

Lưu ý rằng ngôn ngữ anh chị em của JavaScript của JavaScript sẽ không tạo ra lỗi trong ví dụ test1. Tuy nhiên, nếu bạn mở rộng hệ thống phân cấp đối tượng thêm một cấp, bạn cũng sẽ gặp phải các lỗi trong JavaScript:

// ** Error (even in JavaScript) ** because "c" doesn't even exist, so 
// test1.a.b.c.d becomes an attempt to access a property on undefined, 
// which always yields an error. 
alert(test1.a.b.c.d) 

// JavaScript: Uncaught TypeError: Cannot read property 'd' of undefined 
Các vấn đề liên quan