2010-01-31 11 views
12

Ist es möglich, eine Klasse zu überprüfen, ob es eine Methode hat oder nicht? Oder sogar eine bestimmte EigenschaftÜberprüfen Sie, ob eine Klasse eine Methode hat

+0

Nun sieht es aus, wenn ich nur eine if-Anweisung, die überprüft, ob Eigenschaft definiert ist funktioniert. Aber was ist mit Methoden – numerical25

+0

Related: [Actionscript (flex): wie wissen, ob eine Eigenschaft des Objekts existiert (oder definiert)?] (http://stackoverflow.com/questions/1520610) –

Antwort

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 Beachten Sie jedoch, dass private/geschützte Eigenschaften/Funktionen des Objekts nicht aufgelistet werden. – Amarghosh

+1

Ja, wahrscheinlich brauche ich es nicht, wenn es privat oder geschützt ist. Danke – numerical25

+0

Dies ist die einzige richtige Antwort, soweit eine Eigenschaft/Methode tatsächlich existiert (d. h. sie ist aufzählbar), da eine Eigenschaft trotz der Beibehaltung des Wertes 'undefiniert' auch mit strikter Gleichheit definiert werden kann. Zum Beispiel: 'var obj: Object = {a: undefiniert};' wird true für 'obj [" a "] === undefined', aber die Eigenschaft" a "ist immer noch definiert, wie die folgende Schleifenverfolgung zeigt "a": 'für (var key: * in obj) Trace (Schlüssel); // verfolgt "a" '. Um die Eigenschaft loszuwerden, müssten Sie 'delete obj [" a "]' aufrufen. Um genau nach einer Nicht-Null-Funktion zu suchen, wäre 'if (Ziel [Name] ist Funktion)' am besten. – 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); 
} 

(Hinweis: done aus der Spitze von meinem Kopf)

+0

'describeType' listet keine dynamischen Eigenschaften . Versuchen Sie es mit diesem Objekt zum Beispiel: 'var target: Objekt = {a: 123, b:" ASD ", c: function(): void {trace (" hallo ");}}' - gibt die Beschreibung einer Ebene aus Objekt mit nur 'hasOwnProperty',' isPrototypeOf' und 'propertyIsEnumerable'. – Amarghosh

+0

Keine Notwendigkeit, 'describeType' zu verwenden, die sehr langsam ist. – miguelSantirso

+1

describeType kann langsam sein. Wenn Sie jedoch eine Methode zum Verarbeiten des XML in eine objektorientierte Struktur erstellen und diese in einem Wörterverzeichnis nach Typnamen zwischenspeichern, wird der Overhead von describeType nur beim allerersten Durchlauf für einen bestimmten Typ verursacht , nach denen eine einfache Dictionary-Cache-Suche nach Typname sehr schnell ist (getQualifiedClassName (Instanz oder Klasse) ist etwa 3000 mal schneller). Der einzige Haken von describeType besteht darin, dass dynamische Eigenschaften nicht erfasst werden, aber das ist beabsichtigt. – Triynko

2

Sie können auch Methoden/Eigenschaften aus einem Array/Lookup-Methode aufrufen, wie folgt. Wenn es nicht existiert, wird es "undefiniert" sein, was auch als "falsch" gilt.

var target:Object;// = some object 

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

Es ist vielleicht besser, nach undefiniertem 'if (target [" propertyName "] == undefined)' zu suchen. Andernfalls, wenn die Eigenschaft definiert ist, aber auf etwas gesetzt ist, das zu "false" führt (dh eine empty Zeichenfolge, "null", "0" oder "false"), wird dies als "nicht vorhanden" betrachtet. – IQAndreas

+0

Wenn ich versuche, das für eine Funktion zu verwenden, stürzt es mit Fehler 1069 ab - selbst wenn ich nur überprüfe, ob es wahr oder falsch ist. Ich mache es mit dem Schlüsselwort this (für syntaktische Recherche). Warum? – Panzercrisis

+1

Sie müssen strikte Gleichheit (===) verwenden, um 'undefined' zu vergleichen. Außerdem können nur nicht typisierte Variablen 'var x: *' den Wert undefined speichern. Null ist (==) zu undefiniert, aber nicht (===) zu undefiniert. Wenn also die Eigenschaft existiert und null ist, wird der Vergleich mit undefiniert mit == den Wert true zurückgeben, obwohl die Eigenschaft existiert und einen Nullwert enthält. In der Tat, sogar mit strikter Gleichheit, kann eine Eigenschaft * definiert * werden und den Wert "undefiniert" behalten, was immer noch nicht dasselbe ist wie * ist * undefiniert (dh das Ausführen einer for (var key: * in obj) Schleife wird immer noch funktionieren Rückgabe der Immobilie). Daher ist nur 'if (key in obj) 'korrekt. – Triynko

Verwandte Themen