2008-11-22 17 views
21

Ich möchte dies in Actionscript tun:Wie überprüft man, ob in Actionscript zwei Objekte vom selben Typ sind?

typeof(control1) != typeof(control2) 

zu testen, ob zwei Objekte vom gleichen Typ sind. Dies würde in C# gut funktionieren, aber in Actionscript nicht. Tatsächlich gibt es 'object' für beide typeof() Ausdrücke zurück, weil Actionscript so funktioniert.

Ich konnte nicht finden, eine Alternative zu suchen, indem Sie im Debugger oder auf Seiten, die typeof() in Actionscript beschreiben.

Gibt es eine Möglichkeit, den tatsächlichen Laufzeittyp zu erhalten?

Antwort

19

Der beste Weg ist flash.utils.getQualifiedClassName() zu verwenden. Zusätzlich können Sie flash.utils.describeType() verwenden, um ein XML-Dokument zu erhalten, das mehr über die Klasse beschreibt.

+0

Sie würden denken, dass dies das Standardverhalten wäre, aber ActionScript wusste ... besser? –

+0

Ich glaube, 'getQualifiedClassName' ist langsamer als der 'ist'-Operator. Es ermöglicht jedoch auch einen Vergleich mit Strings anstelle von Klassen, was nützlich sein kann, um die Kompilierung von Klassen zu vermeiden, die Sie nicht verwenden (die aber immer noch nach Objekttypen suchen können). – ericsoco

4

Sie möchten den Object.prototype.constructor verwenden.

Vom documentation:

dynamic class A {} 
    trace(A.prototype.constructor);  // [class A] 
    trace(A.prototype.constructor == A); // true 
    var myA:A = new A(); 
    trace(myA.constructor == A);   // true 

(Praktischerweise ist dies auch, wie Arten in Javascript, um zu überprüfen, was ist das, was ursprünglich führte mich dazu in der Dokumentation)

Also, dies zu testen, Bevor ich hier gepostet habe, habe ich es in einer App versucht, die ich in einer Klasse namens Player habe. Da der Prototyp Eigenschaft statisch ist, können Sie es nicht nennen mit „this“, aber Sie können nur den Umfang Kennung überspringen und es funktioniert:

public function checkType():void { 
    trace(prototype.constructor, prototype.constructor == Player); 
    // shows [class Player] true 
} 
+1

Es ist erwähnenswert, dass, wenn Sie dies für eine Klasse verwenden möchten, die nicht als dynamisch markiert ist, müssen Sie die Instanz zuerst auf ein Objekt umwandeln. Object (myA) .constructor – Clintm

1

Wenn Sie für die Vererbung erklären wollen, dann könnten Sie so etwas versuchen:

if (objectA is objectB.constructor || objectB is objectA.constructor) 
{ 
    // ObjectA inherits from ObjectB or vice versa 
} 
17

Actionscript 3 eine hat, ist Operator, der verwendet werden kann, Objekte zu vergleichen. Betrachten Sie den folgenden Code ein:

var mySprite:Sprite = new Sprite(); 
var myMovie:MovieClip = new MovieClip(); 

trace(mySprite is Sprite); 
trace(myMovie is MovieClip); 
trace(mySprite is MovieClip); 
trace(myMovie is Sprite); 

, die die folgende Ausgabe erzeugt:

true 
true 
false 
false 

Diese für integrierte Klassen funktionieren wird, und Klassen, die Sie selbst erstellen. Das Actionscript 2 Equivalent des ist Operator ist instanceof.

0
Object obj = new Object(); 
Object o = new Object(); 

if(o.getClass().getName().endsWith(obj.getClass().getName())){ 
    return true;  
}else{ 
     return false; 
} 
0

Allgemeiner gesagt, wenn Sie wollen testen, ob Objecta ein Subtyp von ObjectB ist

import flash.utils.getDefinitionByName; 
import flash.utils.getQualifiedClassName; 

... 

if (objectA is getDefinitionByName(getQualifiedClassName(objectB))) 
{ 
    ... 
} 
3

Gibt es eine Möglichkeit, den tatsächlichen Laufzeittyp zu bekommen?

Ja.

var actualRuntimeType:Class = Object(yourInstance).constructor; 

Einige andere Antworten beziehen sich bereits auf .constructor, aber man kann nicht immer direkt zugreifen .constructor in Actionscript 3.Es ist nur auf dynamic Klassen zugänglich, die meisten Klassen nicht. Der Versuch, es in einer regulären Klasse zu verwenden, führt unter den Standardeinstellungen zu einem Fehler bei der Kompilierung.

Da jedoch jede Klasse von Object erbt, die dynamic ist, können wir ihre .constructor Eigenschaft schauen nur durch eine Instanz Object Gießen.

Deshalb, wenn wir in Unterklassen nicht interessiert sind, können wir bestätigen, dass zwei Instanzen von genau der gleichen Klasse sind, indem einfach diese Auswertung:

Object(instanceA).constructor === Object(instanceB).constructor; 

ich dieses von der Post gelernt „Get the class used to create an object instance in AS3“ von Josh Tynjälä .


Eine noch einfachere Alternative, die auch für mich funktioniert ist:

var actualRuntimeType:Class = yourInstance["constructor"]; 

Die Laufzeit durchaus in der Lage ist, Ihnen die .constructor geben, es ist nur, dass der Compiler beschwert sich, wenn Sie diese Syntax verwenden. Die Verwendung von ["constructor"] sollte den gleichen Bytecode erzeugen, aber der Compiler ist nicht clever genug, um Sie zu stoppen.

Ich habe diese Sekunde aufgenommen, weil sie nirgendwo außer meiner aktuellen Flash-Umgebung getestet wurde, während mehrere Benutzer gesagt haben, dass die oben beschriebene Methode für sie funktioniert.

+0

Sehr netter Trick, obwohl es nicht mit VectorCollection funktioniert. – Tox

Verwandte Themen