Как получить доступ к родительскому элементу прототипа из функции метода - PullRequest
10 голосов
/ 01 ноября 2010

У меня есть этот класс / функция

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

Я хочу вызвать функцию menuClose(), которая является частью класса Menu, но я думаю, что этот код на самом деле пытается вызвать menuClose() из объекта closetimer.

Как мне ссылаться на menuClose() из объекта Menu из menuTimer()?

Ответы [ 3 ]

16 голосов
/ 01 ноября 2010

В вашем setTimeout() обратном вызове this относится к window, просто сохраните ссылку, подобную этой:

Menu.prototype.menuTimer = function(){
    var self = this;
    this.closetimer = setTimeout(function(){
        self.menuClose();
    }, this.timeout);
}
6 голосов
/ 02 ноября 2010

Другой способ - привязать внутреннюю функцию.

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);
}
4 голосов
/ 01 ноября 2010

вы определяете ссылку на меню (это), пока у вас есть доступ к нему ..

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