Ver Mensaje Individual
  #2 (permalink)  
Antiguo 08/08/2007, 16:11
Avatar de derkenuke
derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 21 años, 2 meses
Puntos: 45
Re: setTimeout en objeto

Hola miguelcubas:

Hace tiempo me encontré con el mismo problema que tú, exactamente el mismo planteamiento. De hecho si creas más instancias de AA() entonces no hay solución (aparentemente).

El error es entendible, ocurre que una llamada a CC.BB() va a funcionar en todo momento, incluso una vez acabada la ejecución del script. Esto es porque CC está definido para todo el ámbito de la página mientras esté abierta. Sin embargo this sólo está definido para el ámbito de ejecución de la función (o método en sí). Después ese this no significa nada ni referencia a nada de nada. Por lo tanto, después de un segundo, this no tiene valor ni apunta a nada.

Lo resolví haciendo la variable CC global, tal y como lo tienes tú. Pero, ¿cómo sabemos dentro del método qué nombre tiene esa variable de ámbito global que contiene la instancia del objeto? Como ves, estoy por saberlo. Para FF funciona, para IE aún no encuentro solución.




Lo que hice fue crearle un número de serie con Math.random() y almacenar la misma instancia en un array que es de ámbito global. Lo tienes todo en este hilo: aporte: programacion secuencial. Entonces, éste código (que es parecido al que tú tienes):
Código PHP:
function coxe() {
    
this.velocidad=50;
    
this.frenar=function() {
        if(
this.velocidad>0) {
            
this.velocidad--;
            
setTimeout("this.frenar()"100);
        }
    }

Se ha de transformar en éste:
Código PHP:
var coxes=new Array();
function 
coxe() {
    
//crear serial para guardar el objeto globalmente
    
do {
        
this.serial=parseInt(Math.random()*1000);
    } while(
coxes[this.serial]!=undefined);
    
coxes[this.serial]=this;
    
this.velocidad=50;
    
this.frenar=function() {
        if(
this.velocidad>0) {
            
this.velocidad--;
            
setTimeout("coxes["+this.serial+"].frenar()"100);
        }
    }

Y así coxes[serialDeUnCoxe] apuntará a la instancia de coxe() que tenga ese serial. Entonces sí que podemos hacer fácilmente el bucle, utilizando un array de ámbito global. Otra cosa es que el serial creado coincida con otro que ya ha sido creado (ojo si creas 10 millones de instancias de coxe() ).



Bueno, si a alguien se le ocurre otra idea, todavía está a tiempo de postear! jeje.




Un saludo.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.