Veo que hay ideas sobre lo que es un prototipo, pero por si alguien
todavia no se aclara, aqui va una explicacion m�s simple:
 
INTRODUCCION A OOP
=====================================================
 
(hablaremos de OOP, prototipaje, herencia, funciones, variables,
m�todos y propiedades, por si alguien quiere saltarse este mail :-)
 
ActionScript es un lenguaje orientado a objetos (OO).
La forma ideal de programar en un lenguaje OO es (curiosamente)
"Programaci�n Orientada a Objetos" (en ingles, OOP)
 
Un objeto es, en un lenguaje OO, algo que se asimila bastante
a lo que es un objeto en la vida real.
 
En OOP, un objeto tiene
 
Por ejemplo, consideremos el objeto "cafetera".
 
En el mundo real, el objeto cafetera tiene caracteristicas (tama�o,
peso, color, precio...) que son unicas para cada objeto.
 
En el mundo real, hay una serie de cosas que puedes hacer con
una cafetera (hacer caf�, limpiarla, guardarla en un armario...)
 
En OOP, las caracteristicas de cada objeto se llaman propiedades,
y las cosas que puedes hacer con el se llaman m�todos.
 
Os habreis dado cuenta de que una propiedad es una variable,
y un m�todo es una funci�n.
 
Volvamos al caso de la cafetera.
 
Imaginemos que tenemos una cafetera roja, de 4 tazas de capacidad,
que nos cost� 2000 pts.
 
En OOP, usando la "dot syntax", estas propiedades se especificarian asi:
 
cafetera.color = "rojo"
cafetera.capacidad = "4"
cafetera.precio = "2000"
 
y los m�todos se especifican asi:
 
cafetera.hacerCafe();
cafetera.limpiar();
cafetera.guardar();
 
Vamos a centrarnos solo en ActionScript y en los objetos que incorpora por
defecto...
 
En AS tenemos un objeto generico llamado MovieClip. Cada nuevo MovieClip
que creamos es una "copia" de este objeto gen�rico (llamado clase)
y hereda las propiedades y m�todos de la clase gen�rica.
La "copia" de un objeto gen�rico o clase se denomina instancia.
 
Esta particularidad (la herencia) es uno de los puntos fuertes de AS, y lo situa
al nivel de lenguajes de alto nivel como Java y C++.
 
Ejemplo (no garantizo que funcione, lo estoy escribiendo de memoria):
 
    // creamos una instancia de la clase MovieClip
    miMovieClip = new MovieClip;
 
    // asignamos valores a las propiedades del MovieClip
    miMovieClip._x = 100;
    miMovieClip._y = 100;
 
    // probamos a llamar a un m�todo de la clase
    miMovieClip.gotoAndStop(2);
 
Vale, hasta ahora es facil. Todos los objetos que creamos a partir de
una clase heredan todos sus m�todos y propiedades (con valores nulos).
 
Pero... �qu� pasa cuando a�ado propiedades a mi instancia?
 
Es decir...
 
    // creamos otra instancia de la clase MovieClip
    miOtroMovieClip = new MovieClip;
 
    // a�adimos propiedades a la nueva instancia
    miOtroMovieClip.mipropiedad = "mivalor";
 
La pregunta es... �como afecta esto a la otra instancia?
La respuesta es... de ninguna manera.
 
Si ahora hicieramos un
 
    trace(miMovieClip.mipropiedad);
 
no obtendriamos ningun resultado.
 
Sin embargo, si hacemos
 
    trace(miOtroMovieClip.mipropiedad);
 
obtendriamos "mivalor"
 
Lo cual en cierto modo es deseable, ya que no queremos que las propiedades
de MovieClips distintos se modifiquen por accidente al cambiar uno de ellos.
 
Pero...
 
�y si queremos a�adir una propiedad a todos los objetos de la misma clase?
 
La respuesta se llama prototipo. Podemos pensar en el prototipo como la
clase de la que proviene una clase.
Cada vez que creamos una instancia, Flash la crea a partir de la clase de
el objeto. Las propiedades y m�todos de la clase se almacenan en el prototipo
de dicha clase.
 
Por ejemplo, si quisieramos a�adir a todos los MovieClip la propiedad "mipropiedad",
hariamos algo como:
 
    MovieClip.prototype.mipropiedad = mivalor;
 
y todos los MovieClip que creemos tendran esa propiedad con ese valor.
No solo eso, sino que todos los MovieClip que ya teniamos en la pelicula
adoptan la nueva propiedad.
 
Con los m�todos el mecanismo es igual:
 
    MovieClip.prototype.miMetodo = function miFuncion(parametros){
        // aqui va la funcion que usaremos como m�todo
    }
 
Empezamos a ver que la potencia y las posibilidades de la herencia y el
prototipaje parecen no tener l�mites.
 
Sin embargo, debido a que en la implementaci�n del plugin de Flash se han
sacrificado varias funcionalidades, el uso mas interesante de los prototipos
de hecho no funciona...
 
Os invito a que intenteis crear un m�todo en el prototipo de MovieClip
que sea fadeIn() y otro que sea fadeOut(), que modifiquen el _alpha
del MovieClip usando un bucle, y probeis a llamarlas desde un boton:
 
en el primer frame:
 
    MovieClip.prototype.fadeIn = function miFadeIn(){
        while (this._alpha <= 100){
            this._alpha += 1;
        }
    }
 
    MovieClip.prototype.fadeOut = function miFadeOut(){
        while (this._alpha >= 0){
            this._alpha -= 1;
        }
    }
 
y en el boton:
 
    on(rollOver){
        miMovieClip.fadeIn();
    }
    on(rollOut){
        miMovieClip.fadeOut();
    }
 
y que descubrais que no funciona :-)
(De hecho si funciona, pero no como esperamos)
 
En fin, me estoy liando y ya he explicado lo que pretendia explicar.
Nos metemos en terreno pantanoso, si alguien quiere leer algo interesante
sobre OOP y prototipos, que se baje este PDF, que en mi opinion debe aclarar
todas las dudas sobre el tema. (Es el primer apendice del libro "Flash 5 Dynamic
Content Studio" de Friends Of Ed, que fue el que me hizo decidirme a comprar
el libro :-)
 
 
Una vez mas, sorry por la paliza de mail... cada dia me salen mas largos... :-)
 
 
a!e /going.back.to.work

Responder a