2010-11-01 7 views
8

tengo esta clase/funciónCómo acceder a los padres de un prototipo de este dentro de la función de un método

function Menu() 
{ 
    this.closetimer = 0; 
    this.dropdown = 0; 
} 

Menu.prototype.menuTimer = function() 
{ 
    this.closetimer = setTimeout(function() 
    { 
    this.menuClose(); 
    }, this.timeout); 
} 

Menu.prototype.menuClose = function() 
{ 
    if(this.dropdown) this.dropdown.css('visibility','hidden'); 
} 

Quiero llamar a la función menuClose() que es parte de la clase de menús, pero creo que este código intenta realidad para llamar al menuClose() desde el objeto closetimer.

¿Cómo hago referencia a menuClose() desde el objeto de menú dentro de menuTimer()?

Respuesta

15

En su setTimeout() de devolución de llamada, this se refiere a window, sólo sigue una referencia así:

Menu.prototype.menuTimer = function(){ 
    var self = this; 
    this.closetimer = setTimeout(function(){ 
     self.menuClose(); 
    }, this.timeout); 
} 
+0

DOH! ¡Gracias! Pedo cerebral. – polyhedron

+0

@polyhedron - welcome :) –

4

se define una referencia al Menú (este), mientras que usted tiene acceso a ella ..

Menu.prototype.menuTimer = function(){ 
    var _self = this; 
    this.closetimer = setTimeout(function(){ 
     _self.menuClose(); 
    }, this.timeout); 
} 
+0

Debe usar 'var _self' para evitar colisiones con el espacio de nombres global. – MForster

+0

@MFoster, ya corregido, gracias :) disparar feliz ... –

6

Otra forma es vincular la función interna.

Menu.prototype.menuTimer = function(){ 
this.closetimer = setTimeout(function(){ 
    this.menuClose(); 
}.bind(this), this.timeout); 
} 

Menu.prototype.menuTimer = function(){ 
this.closetimer = setTimeout(this.menuClose.bind(this), this.timeout); 
} 
+1

¿Podría escribirse esto como 'setTimeout (this.menuClose.bind (this), this.timeout)'? – MForster

+0

Tiene toda la razón y lo he actualizado para mostrar. Es, de lejos, la mejor solución. Dame todos los votos! – clockworkgeek

+0

Esto hace que suene un poco codicioso :-) – MForster

Cuestiones relacionadas