2010-11-01 5 views
8

J'ai cette classe/fonctionComment accéder au parent d'un prototype ce à partir de la fonction d'une méthode

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'); 
} 

Je veux appeler la fonction menuClose() qui fait partie de la classe Menu, mais je pense que ce code tente réellement pour appeler menuClose() à partir de l'objet closetimer.

Comment faire référence à menuClose() à partir de l'objet Menu à partir de menuTimer()?

Répondre

15

Dans votre rappel setTimeout(), this fait référence à window, il suffit de garder une référence comme celui-ci:

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

doh! Merci! PET de cerveau. – polyhedron

+0

@polyhedron - welcome :) –

4

vous définissez une référence au menu (ce) pendant que vous y avez accès ..

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

Vous devriez utiliser 'var _self' pour vous protéger des collisions avec l'espace de noms global. – MForster

+0

@MFoster, déjà corrigé, merci :) déclencher heureux .. –

6

Une autre façon est de lier la fonction interne.

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

Est-ce que cela pourrait être écrit comme 'setTimeout (this.menuClose.bind (this), this.timeout)'? – MForster

+0

Vous avez absolument raison et je l'ai mis à jour pour montrer. C'est de loin la meilleure solution. Donnez-moi tous les votes! – clockworkgeek

+0

Cela vous fait paraître un peu gourmand :-) – MForster

Questions connexes