2010-01-31 19 views
12

¿Es posible verificar una clase para ver si tiene un método o no? O incluso una propiedad particularCompruebe si una clase tiene un método

+0

bien, parece que si hago una declaración if que verifica si la propiedad definida funciona. pero ¿qué ocurre con los métodos – numerical25

+0

Relacionados: [Actionscript (flex): cómo saber si una propiedad de objeto existe (o está definida)?] (http://stackoverflow.com/questions/1520610) –

Respuesta

29
var target:Object;// = some object 
var name:String;// = some name 
if(name in target){ 
    // if property/method exists 
}else{ 
    // if property/method not exists 
} 
+7

+1 Pero tenga en cuenta que esto no mostrará las propiedades/funciones privadas/protegidas del objeto. – Amarghosh

+1

Sí, probablemente no lo necesite si es privado o está protegido. gracias – numerical25

+0

Esta es la única respuesta correcta en cuanto a si una propiedad/método existe realmente (es decir, es enumerable), porque una propiedad puede definirse realmente a pesar de mantener el valor 'indefinido', incluso con estricta igualdad. Por ejemplo: 'var obj: Object = {a: undefined};' rastreará true para 'obj [" a "] === undefined', pero la propiedad" a "aún está definida, como lo demuestra el siguiente trazado de bucle "a": 'para (var clave: * en obj) traza (clave); // rastrea "a" '. Para deshacerse de la propiedad, debe llamar a 'eliminar obj [" a "]'. Para buscar estrictamente una función no nula, 'if (target [name] is Function)' sería lo mejor. – Triynko

2
import flash.utils.describeType; 
... 
function methodExists(obj:Object,name:String):Boolean 
{ 
     var desc:XML=flash.utils.describeType(obj); 
     return (desc.method.(@name==name).length()>0); 
} 

(Nota: hecho de la parte superior de mi cabeza)

+0

'describeType' no enumera las propiedades dinámicas . Pruébalo en este objeto, por ejemplo: 'var target: Object = {a: 123, b:" ASD ", c: función(): void {trace (" hello ");}}' - muestra la descripción de un plano objeto con solo 'hasOwnProperty',' isPrototypeOf' y 'propertyIsEnumerable'. – Amarghosh

+0

No es necesario utilizar 'describeType', que es muy lento. – miguelSantirso

+1

describeType puede ser lento, pero si crea un método para procesar el XML en una estructura orientada a objetos y lo guarda en caché en un diccionario por nombre de tipo, incurrirá en la sobrecarga de describeType solo en la primera ejecución para cualquier tipo dado , después de lo cual una simple búsqueda de caché de diccionario por nombre de tipo es muy rápida (getQualifiedClassName (instancia o clase) es aproximadamente 3000 veces más rápido). describe la única captura deType es que no captura las propiedades dinámicas, pero eso es por diseño. – Triynko

2

También puede llamar a métodos/propiedades de un método de matriz/de búsqueda como sigue. Si no existe, será 'indefinido', que también cuenta como 'falso'.

var target:Object;// = some object 

if(target["propertyName"]){ 
    // if property/method exists 
}else{ 
    // if property/method not exists 
} 
+1

Puede ser mejor comprobar si hay 'if (target [" propertyName "] == undefined)' indefinido) '. De lo contrario, si la propiedad está definida pero configurada como algo que se evalúa como 'falso' (es decir, una cadena emtpy,' null', '0', o' false'), se considerará que "no existe". – IQAndreas

+0

Si trato de usar eso en una función, me chocará con el error 1069, incluso cuando solo estoy comprobando si es verdadero o falso. Lo estoy haciendo con la palabra clave this (para investigación sintáctica). ¿Por qué? – Panzercrisis

+1

Debe usar igualdad estricta (===) para comparar 'indefinido'. Además, solo las variables sin tipo 'var x: *' pueden almacenar el valor indefinido. Null es (==) undefined, pero no (===) undefined, por lo que si la propiedad existe y es nula, al comparar undefined with == se devolverá true, a pesar de la propiedad existente y que contiene un valor nulo. De hecho, incluso con igualdad estricta, una propiedad puede * definirse * y mantener el valor "indefinido", que todavía no es lo mismo que * siendo * indefinido (es decir, ejecutando un for (tecla var: * en obj) el bucle seguirá siendo devolver la propiedad). Por lo tanto, solo 'if (key in obj)' es correcto. – Triynko

Cuestiones relacionadas