Come abbiamo visto nei tutorials di Actionscript base, possiamo aggiungere delle proprietà ad un oggetto a runtime, dinamicamente.
In questo tutorial vedremo che è possibile implementare dinamicamente anche dei metodi agli oggetti ( in questo caso la classe Object ).
Il codice che vedremo non è altro che un qualsiasi oggetto, deve essere un' istanza di una classe dinamica ( infatti la classe Object di Actionscript 3.0 è dinamica ), può avere proprietà e metodi implementati da noi dinamicamente.
Molto utile quando si caricano dei files XML per associare i dati dell' XML ad un oggetto.
Vediamo alcuni esempi...
Esempio 1
Code:var miles:Object=new Object(); miles.surname="davis"; trace(miles.surname); miles.getSurname=function():String { return this.surname; } trace(miles.getSurname());In questo caso implemento una proprietà surname ad un oggetto miles.
Posso recuperare o assegnare il valore di tale proprietà direttamente ( come da primo trace ):
Code:trace(miles.surname);oppure implementando un metodo ( funzione ) allo stesso oggetto che restituisce il valore della proprietà "surname"
Code:miles.getSurname=function():String { return this.surname; } trace(miles.getSurname());Da notare che ho usato il "this" per riferirmi alla proprietà surname dell' oggetto dall' interno del metodo.
Se non utilizzassi il "this", Flash cercherebbe una variabile globale di nome surname e dato che non c'è ci restituirebbe un errore.
Esempio 2
Code:var miles:Object=new Object(); miles.surname="davis"; miles.sex="male"; miles.music="jazz"; miles.getInfo=function():String { return("miles "+this.surname+" is "+this.sex+" and plays "+this.music); } trace(miles.getInfo());In questo caso implemento un metodo chiamato getInfo all' oggetto miles che mi restituisce un concatenamento di stringhe effettuato sulle proprietà dell' oggetto miles.
Come da trace:
Code:trace(miles.getInfo());Esempio 3
Code:var miles:Object=new Object(); miles.surname="davis"; miles.sex="male"; miles.music="jazz"; miles.skin=function():uint { return skinColor("black"); } var jaco:Object=new Object(); jaco.surname="pastorius"; jaco.sex="male"; jaco.music="fusion"; jaco.skin=function():uint { return skinColor("white"); } function skinColor(s:String):uint { var col:uint; switch(s) { case "black": col=0x000000; break; case "white": col=0xFFFFFF; break; case "red": col=0xFF0000; break; case "yellow": col=0xFFFF00; break; } return col; } trace(miles.skin()); trace(jaco.skin());In questo caso abbiamo 2 oggetti ( miles e jaco ) ed una funzione ( skinColor ) dichiarati globalmente.
La funzione skinColor viene utilizzata per assegnare i valori ai metodi skin di entrambi gli oggetti.
Infatti i metodi skin richiamano a loro volta la funzione skinColor passandogli un valore e ricevendone un altro ( in questo caso il numero esadecimale di un colore ).
Allego i files sorgente:
Bookmarks