Обращение к объектной функции в обработчике событий JavaScript - PullRequest
1 голос
/ 13 февраля 2012

допустим, у меня есть JavaScript-класс, подобный этому:

Foo.prototype = {
  init: function() {
    $(document).keydown(function(event) {
      this.onKeyDown(event);
    });
  }

  onKeyDown: function(event) {
    alert("bar");
  }
}

myObj = new Foo();
myObj.init();

Этот код не будет работать, потому что в

$(document).keydown(function(event) {
    this.onKeyDown(event);
});

'this', конечно, неизвестно и не относится к объекту. Как я могу в любом случае обратиться к onkeydown-методу Foo-Class?

Я не хочу заменять 'this' на 'myObj' (имя объекта), так как я могу захотеть использовать класс для других объектов.

Спасибо за вашу помощь!

1 Ответ

4 голосов
/ 13 февраля 2012

Сохраните его в переменной ...

Foo.prototype = {
  init: function() {
    var self = this
    $(document).keydown(function(event) {
      self.onKeyDown(event);
    });
  }
}

или используйте jQuery.proxy, чтобы вернуть функцию с ограниченным значением this ...

Foo.prototype = {
  init: function() {
    $(document).keydown( $.proxy(function(event) {
      this.onKeyDown(event);
    }, this) );
  }
}

или выможно использовать Function.prototype.bind, но вам нужно будет установить его для старых браузеров.

Foo.prototype = {
  init: function() {
    $(document).keydown( (function(event) {
      this.onKeyDown(event);
    }).bind(this) );
  }
}
...