Vous êtes ici : Accueil - Ressources Flash - Occurence de la classe Object sans prototype.
Il est des fois où un programmeur à besoin d'une variable uniquement pour le fait qu'elle existe et renvoie true sans autre but - même pas de cas en false.
Sous Flash, la façon la plus simple serait de créer une occurence de la classe Boolean, mais il est tout à fait possible de passer par des instanciations des classes String et Object.
// Première méthode dans le cas d'un object:
maVar = new Object();
// Deuxième méthode :
maVar = {};
Le problème qui se pose dès lors est que l'on instancie aussi tout ce qui est inclu dans la classe : les propriétées système __proto__ et __constructor__, ainsi que la chaîne des prototypes. Cela prend de la mémoire dans le scope de Flash, et du temps. Pour un cas isolé, cette fraction de temps serait négligeable, mais dans des routines de calculs instanciant des milliers d'occurences, la somme de ces instants peut devenir vraiment long.
Une petite astuce cependant permet de créer un objet de classe vide, sans proto et sans contructor: il suffit en fait de ne pas instancier la classe avec l'opérateur new, puisque c'est cette opérateur qui créé les propriétées de l'occurence de la classe :
// Première méthode dans le cas d'un object:
maVar = Object();
Note : je sais pas si en programmation, cette astuce porte un nom. Pour ma part, je dis que l'occurence de la classe est "nue". \^o^/
La portion de code qui suit permet de lister les propriétées et méthodes incluses dans plusieurs cas d'instanciation de la classe Object :
o1 = new Object();
o2 = Object();
o3 = Object; // avec un O majuscule
o4 = object; // avec un o minuscule
// pour chaque instance déclarée ci-desssus
for ( var n = 1; n <= 4; n++ ) {
trace ( "\n// objet o" + n );
trace ( o = eval( "o" + n ) );
// on déprotège à la lecture
ASSetPropFlags( o, null, 0, 1 );
// et on liste les propriétées et méthodes incluses
for ( i in o )trace ( "\t" + i + "\t" + o[i] ) ;
}
Et on obtient en sortie :
// Sortie sous Flash MX
// objet o1
[object Object]
__constructor__ [type Function]
constructor [type Function]
__proto__ [object Object]
// objet o2
[type Object]
// objet o3
[type Function]
registerClass [type Function]
__proto__ [object Object]
constructor [type Function]
prototype [object Object]
// objet o4
[type Function]
registerClass [type Function]
__proto__ [object Object]
constructor [type Function]
prototype [object Object]
// Sortie sous Flash MX2004
// objet o1
[object Object]
__constructor__ [type Function]
__proto__ [object Object]
// objet o2
[type Object]
// objet o3
[type Function]
registerClass [type Function]
__proto__ [object Object]
constructor [type Function]
prototype [object Object]
// objet o4
undefined
Suivant les sorties sous Flash MX et Flash MX2004, la déclaration sans le constructeur new créé bien une occurence de type Object et totalement dépourvu de méthode et de propriétée. On notera une petite différence pour o4 sous MX2004 qui indique bien qu'il faut respecter la casse.
Dans le petit script en haut, il est possible de traiter chacune des classes et voir ce qu'elles sortent; en l'occurence, la classe Boolean renvoie undefined pour o2, tandis que la classe String renvoye une erreur de compilation, toujours pour o2. Seule donc la classe Object est intéressante pour son instanciation sans opérateur new.
Il est ensuite possible de vérifier l'existance de l'objet en codant ceci :
o = Object();
if ( typeof( o ) == "object") trace ("ok");
Si l'objet est correctement déclaré, o n'accepte qu'un seul type et renvoye bien true pour la condition, sinon, dans n'importe quel autre cas, elle retourne false.
Note : la déclaration des objets dans les maps virtuelles du mapping scroller est basée sur cette astuce : la grandeur des maps devant gérer plusieurs milliers d'occurence graphiques, la déclaration de la classe Objet pour chaque élément graphique prenait trop de ressources dans le scope de Flash et en temps d'instanciation.