Als "ausgelöst" ein Ereignis von einem Objekt-Kontext, der das übergeordnete Objekt, dass der Geltungsbereich aller Variablen repräsentiert wird, wird das Objekt selber. Diese Funktion, die typisch für die objektorientierte Programmierung, kann verwirrend verursachen Fehler und Bugs im Code. Darüber hinaus in bestimmten Situationen kann verhindern den Zugriff auf einige Variablen "vor" zur Verfügung.
Zunächst sehen wir eine Funktion von ActionScript im Zusammenhang mit Context-Management, die, falls vorhanden, wird uns retten ein paar Stunden unnötiger Tests. Wenn wir mit Grafiken oder einfach verschachtelte ineinander MovieClip zu tun haben, das Eigentum _parent Lösung von Problemen in Zusammenhang. Zum Beispiel, wenn der MovieClip padre_mc Es enthält einen anderen MovieClip figlio_mc und verwenden Sie den folgenden Code ein:
1 2 3 4 5 | / / Code in padre_mc ( ) { figlio_mc. onRelease = function () { this ) ; // figlio_mc trace (this); / / figlio_mc this . _parent ) ; // padre_mc trace (this. _parent); / / padre_mc } |
Risalisre der "Vater", dann ist klar und direkt.
Mit Klassen wie auch, Code-only, oder die Erweiterung der MovieClip-Eigenschaft _parent ist nicht verfügbar und konnte Dinge zu komplizieren! Immaginiiamo um eine Klasse MyClass :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | MovieClip { Klasse MyClass erstreckt MovieClip { function MyClass () { / / Konstruktor } / / Funktion myMethod () { this ) ; // myClass trace (this); / / myClass ; var num = 5; ; var cp = this; .... [ un oggetto ] ; var myObject = new [ein Objekt]; ( ) { myObject. onLoad = function () { this ) ; // myObject trace (this); / / myObject cp ) ; // myClass trace (cp), / / myClass } } |
, ovvero il puntatore alla classe MyClass . Der Kontext der MyMethod() ist natürlich, this , das ist der Zeiger auf die Klasse MyClass . . Die Variable num , zum Beispiel, hat einen Lebenszyklus innerhalb der Methode geschlossenen MyMethod() . Es ist daher nur dann sichtbar, in der Methode und wird beim Verlassen zerstört werden. . Das Gleiche gilt für die variable myObject initialisiert ein Ereignis, das jedoch in diesem Fall onLoad . lasciandoci, apparentemente, senza il puntatore alla classe madre myClass . Wenn ausgelöst onLoad() wird der Kontext zu myObject verlassen, scheinbar, ohne die Zeiger auf das übergeordnete Klasse myClass . , ha lo stesso contesto della variabile myObject ! Ein genauerer Blick auf den Code sehen wir, dass die Variable cp , in der Methode definierten myMethod() , den gleichen Kontext der Variable myObject ! dell'oggetto myObject in quanto condivide con esso lo stesso contesto. Tatsächlich ist die variable cp (Klasse Zeiger) sichtbar sein wird innerhalb der Methode onLoad Objekt myObject , da es die gleichen Kontext Aktien. ha necessità di “vivere” più al lungo del previsto visto che ha “allocato” un evento (di tutto questo se ne occupa Flash a nostra “insaputa”). In der Tat die Methode myMethod() ist nicht nur, weil das Objekt freigegeben wird myObject hat die Notwendigkeit der "live" über die länger als erwartet, weil es "zugewiesen" ein Ereignis (all dies ist mit Flash in unser "Wissen" zu tun).
Beratung
Für Veranstaltungen mit Knöpfen oder MovieClip verbunden wäre eine gute Gewohnheit, um das Formular zu verwenden:
1 2 3 4 5 | my_mc onRelease = myOnRelease.; myOnRelease function () { this ) ; // _root trace (this) / / _root "Click me" ) ; trace ("Klick mich"); } |
Statt der schnelleren und unmittelbar:
1 2 3 4 | ( ) { my_mc. onRelease = function () { this ) ; // my_mc trace (this); / / my_mc "Click me" ) ; trace ("Klick mich"); } |
Der Vorteil der Verwendung einer externen Funktion ist es, einen neutralen Kontext und die Fähigkeit, die Funktion unabhängig von der MovieClip, dass es steuert den Zugriff zu haben. Im zweiten Fall, sollten zum Beispiel, wenn Sie die Ausführung des Codes im Zusammenhang mit "Klick" der MovieClip Kraft wollte ich einen Code wie diesen:
1 | ; . my_mc onRelease (); |
In der Praxis Ich nenne das Ereignis, als ob es eine Methode waren. Allerdings habe ich - in der Tat - die MovieClip haben my_mc . Ein anderer Weg, aber ich kann Ausführung von Code direkt aufruft myOnRelease() . Natürlich, wie in den Beispielen, Auge in Zusammenhängen gezeigt. . Im ersten Fall, den Kontext der myOnRelease() ist die Muttergesellschaft des Objekts, wo es geschrieben steht, z. B. _root . Im zweiten Fall jedoch ist der Kontext immer die MovieClip my_mc !
Erzwingen einer anderen Kontext
Wir schließen mit einer nützlichen Tricks in vielen Fällen. in grado di forzare un contesto di un metodo o funzione. Flash bietet eine Bibliothek, mx.utils mit einem Objekt Delegate erzwingen Kontext einer Methode oder Funktion. Seine Verwendung ist sehr einfach:
1 2 3 4 5 6 7 8 | utils . Delegate ; .. Import mx utils Delegierter; / / // puntatore ad un MovieClip my_mc var, / / Zeiger auf eine MovieClip // un bottone my_btn var / / a-Taste Funktion myFunction () { this ) ; trace (this); } create ( my_mc , myFunction ) ; my_btn onPress = Delegate erstellen (my_mc, myFunction)..; |
Die Veranstaltung onPress my_btn den Button verweist auf eine "neue" Funktion genau mit dem Kontext my_mc erstellt. Wenn Sie auf den Button klicken my_btn, wird der Code in myFunction() als Kontext wird my_mc!










Es gibt keine Kommentare für diesen Beitrag
Hinterlasse einen Kommentar