2010-05-02 17 views
27

Estoy intentando leer una propiedad en una serie de Sprites. Esta propiedad puede o no estar presente en estos objetos, e incluso no declararse, peor que ser nula.¿Cómo puedo probar si una propiedad existe en un objeto antes de leer su valor?

Mi código es:

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

Y así flash me muestra:

Error # 1069: propiedad seleccionable no se encuentra en flash.display.Sprite y no hay ningún valor predeterminado.

¿Hay alguna manera de comprobar si una propiedad existe antes de leer su valor?

Algo así como:

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

Respuesta

53

objetos en AS3 tienen el método hasOwnProperty que toma un argumento de cadena y devuelve true si el objeto ha definido esa propiedad.

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

intentar algo como esto:

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

} 
+4

esto puede causar errores si no existe en primer lugar. Vería el error si está creando un objeto dinámicamente como buscar un ["b"] en 'var a: Object = {a: '1'}' – Daniel

+0

(Esto no funciona) – Lego

+0

var a; a = a {a: 1}; trace (a ["b"]), genera "undefined", pero no genera ningún error. Entonces, ¿dónde está el problema en el uso de esta manera? –

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

La adición de este, ya que es una respuesta superior en Google.

Si usted está tratando de comprobar si existe una constante usando una cadena para el nombre a continuación, utilizar

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

Respuesta a @Vishwas G (no un comentario, porque los bloques de código no se admiten en los comentarios):

Como Daniel señaló, si el objeto "a" en su ejemplo no existe en primer lugar, su intento de acceder a "b" en "a" causará un error. Esto sucede en casos donde se espera una estructura profunda, como un objeto JSON que podría, por ejemplo, tener el formato "content.social.avatar". Si "social" no existe, entonces intentar acceder a "content.social.avatar" causará un error.

Aquí está un ejemplo-caso general de una prueba de la propiedad-existencia-estructura profunda donde el enfoque "indefinido" puede causar un error en los casos en que el "hasOwnProperty()" enfoque no:

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

Ahora las pruebas ...

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

Tenga en cuenta que el lenguaje de hermanos de ActionScript JavaScript no generaría un error en el ejemplo de prueba1. Sin embargo, si extiende la jerarquía de objetos un nivel más, también encontrará errores en 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 
Cuestiones relacionadas