6

我不确定如何准确地表达我的问题,所以让我举一个例子:

function foo() {
  window.addEventListener("keydown", function(event) {
        bar(event.keycode);
}

foo.prototype.bar = function (keycode) {
//code
}

我尝试过使用this.bar(),但这导致使用windowas this。有没有办法做到这一点,还是我必须手动调用另一个初始化方法?

4

3 回答 3

8

在通过之前绑定this.bar到。this

function foo() {
    window.addEventListener("keydown", this.bar.bind(this), false);
}


foo.prototype.bar = function (event) {
    console.log(event.keyCode);
}

演示http://jsfiddle.net/2tee4/

于 2012-07-06T14:31:05.287 回答
5

如果您没有Function.prototype.bind可用的*,并且您不愿意添加额外的功能,另一种解决方案Function.prototype是关闭对 的调用this.bar

function foo() {
    var self;
    self = this;
    window.addEventListener('keydown', function (e) {
        self.bar(e);
    }, false);
}
foo.prototype.bar = function (e) {
    console.log(e.keyCode);
}

* 虽然你使用addEventListenerwithoutattachEvent让我相信这Function.prototype.bind是一个可以接受的选择


此外,诸如jQuery 之类的库jQuery可能包含它们自己的形式。bindjQuery.proxy

于 2012-07-06T14:44:42.700 回答
4

如果您的意图是为每个foo创建的侦听器添加一个新的侦听器,另一个选项是foo实现EventListener接口,并简单地传递this代替处理程序。

function Foo() {
    window.addEventListener("keydown", this, false);
}

Foo.prototype.bar = "foobar";

Foo.prototype.handleEvent = function(e) {
    console.log(e.type);   // "mousedown" (for example)
    console.log(this.bar); // "foobar"
};

new Foo();

请注意,这仅适用于addEventListener().

演示:http: //jsfiddle.net/k93Pr/

于 2012-07-06T14:49:03.620 回答