Órale Joseba, que interesante lo que comentas de los tiempos, no sabía
eso. Aunque estuve haciendo algunos experimentos, con la clase(y el tipo
primitivo) Number igual se tarda el doble; pero con Array es diferente,
miremos este ejemplo:

<code>
trace("\nARRAY");
var primitiv_array:Array = ["mnnn", 4, "Q", 5, new Object(), "mock"];
var t:Number = getTimer();
for (var i = 0; i < 100000; ++i) {
        primitiv_array.toString()
}
trace("Tiempo con la primitiva: " + (getTimer() - t) + " ms.");
var objet_array:Array = new Array("mnnn", 4, "Q", 5, new Object(),
"mock");
t = getTimer();
for (var i = 0; i < 100000; ++i) {
        objet_array.toString()
}
trace("Tiempo con el objeto: " + (getTimer() - t) + " ms.");
</code>

-----Mensaje original-----
De: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] En
nombre de Joseba Alonso
Enviado el: martes, 12 de julio de 2005 13:07
Para: asnativos@5dms.com
Asunto: RE: [ASNativos] Una tontería

Es un poco de lo mismo de antes, el operador typeof devuelve el tipo
primitivo del *valor* que contiene la variable. El problema es que en
realidad para Flash una clase *no* es un tipo. Recuerda que aunque con
el
AS2 nos parezca lo contrario, Flash sigue siendo un lenguaje basado en
prototypes, no un lenguaje "real" OOP basado en clases. Cualquier valor
con
una clase asociada nos devolvera "object" como tipo primitivo:

<script>
var mistring = "hola";
trace(typeof mistring); // "string"

var mistring2 = new String("hola");
trace(typeof mistring2); // "object"

var mifuncion = function(){};
trace(typeof mifuncion); // "function";

var mifuncion2 = new Function();
trace(typeof mifuncion2); // "object";

var miclip = _root.createEmptyMovieClip("clip",1);
trace(typeof miclip); // "movieclip"

var miclip2 = new MovieClip();
trace(typeof miclip2); // "object"

</script>

Para comprobar si un objeto pertenece a una clase se utiliza el
instanceof,
para obtener la clase asociada a un valor se utiliza __proto__.

Un ejemplo mas o menos claro:

<script>
var s1:String = "hola";
trace(s1 instanceof String); // false
trace(typeof s1); // "string"
</script>

Con los literales generamos valores primitivos, y no se asocia ninguna
clase. Por eso el instanceof nos devuelve 'false' y el type es 'string'.
Si
queremos un objeto "real" de la clase String tenemos que hacer:

<script>
var s2:String = new String("hola");
trace(s2 instanceof String); // true
trace(typeof s2); // "object"
</script>

Lo que ocurre es que para que no nos volvamos locos (más) Flash nos
permite
llamar a metodos y propiedades sobre los valores primitivos aunque no
pertenezcan a ninguna "Clase" esto lo hace generando el objeto y
aplicando
el metodo/propiedad de manera transparente para nosotros. Esto se puede
demostrar con el siguiente script:

<script>
var primitiva:String = "un literal";
var t:Number = getTimer();
for(var i:Number = 0;i<100000;i++){
        primitiva.indexOf("l");
}
trace("Tiempo con la primitiva: "+(getTimer()-t)+" ms.");
var objeto:String = new String("un objeto");

t = getTimer();
for(var i:Number = 0;i<100000;i++){
        objeto.indexOf("l");
}
trace("Tiempo con el objeto: "+(getTimer()-t)+" ms.");
</script>

Si lo ejecutas te dáras cuenta que con la primitiva tarda el triple de
tiempo el llamar a los metodos, es el tiempo que tarda en generar el
objeto
por detrás y aplicar el metodo, mientras que con el objeto ya creado el
llamar al metodo es mas rapido porque ya esta generado.

Pfff, vaya chapa xDD, a ver si ha quedado claro ;)

Un saludo,


Joseba Alonso
www.5dms.com
www.sidedev.net  


----------------------------------
Lista ASNativos:asnativos@5dms.com
http://www.5dms.com/listas
----------------------------------
----------------------------------
Lista ASNativos:asnativos@5dms.com
http://www.5dms.com/listas
----------------------------------

Responder a