2010-05-02 11 views
27

Próbuję odczytać właściwość z serii Sprites. Ta właściwość może, ale nie musi być obecna na tych obiektach, a nawet nie może być zadeklarowana, gorsza niż zerowa.Jak sprawdzić, czy właściwość istnieje na obiekcie przed odczytaniem jego wartości?

Mój kod to:

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

I tak zapłonu pokazuje mi:

Error # 1069: Property wyboru nie znaleziono flash.display.Sprite i nie ma wartości domyślnej.

Czy istnieje sposób sprawdzenia, czy właściwość istnieje przed odczytaniem jej wartości?

Coś jak:

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

Odpowiedz

53

Obiekty w AS3 mają metodę hasOwnProperty która przyjmuje argument ciąg i zwraca true jeśli obiekt jest, że własność zdefiniowana.

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

Spróbuj czegoś takiego:

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

} 
+4

może to spowodować błędy, jeśli nie istnieje. zobaczysz błąd, jeśli dynamicznie tworzysz obiekt, np. szukając ["b"] w 'var a: Object = {a: '1'}' – Daniel

+0

(To nie działa) – Lego

+0

var a; a = a {a: 1}; trace (a ["b"]), wyświetla "undefined", ale nie generuje żadnego błędu. Więc gdzie jest problem z używaniem w ten sposób? –

1

Dodanie tego, ponieważ jest to top odpowiedź w Google.

Jeśli chcesz sprawdzić, czy istnieje stała przy użyciu ciąg dla nazwy następnie używać

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

odpowiedź do @Vishwas G (nie komentarzu ponieważ kody nie są obsługiwane w komentarzach):

Jak zauważył Daniel, jeśli obiekt "a" w twoim przykładzie nie istnieje, próba dostępu do "b" na "a" spowoduje błąd. Dzieje się tak w przypadkach, gdy oczekujesz głębokiej struktury, takiej jak obiekt JSON, który może na przykład mieć format "content.social.avatar". Jeśli "społeczność" nie istnieje, próba dostępu do "content.social.avatar" spowoduje błąd.

Oto przykład ogólnego przypadku testu właściwość egzystencji głęboka struktura, gdzie podejście „nieokreślony” może spowodować błąd w przypadkach, gdy „hasOwnProperty()” podejście nie:

// 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"}}}; 

teraz testy ...

// ** 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")); 

Należy zauważyć, że JavaScript języka rodzeństwa ActionScript nie wygenerowałby błędu w przykładzie test1. Jeśli jednak rozszerzysz hierarchię obiektów o jeszcze jeden poziom, możesz również natrafić na błędy w 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 
Powiązane problemy