10

我有一个名为 Foo 的类(或包含函数的对象;我听说没有 Javascript 类之类的东西),它带有一个附加到单击事件的事件处理程序。当调用事件处理程序时,我想修改我的类 Foo 的属性。通常,我会使用this关键字,但在事件处理程序中,this引用设置为对 html 元素的引用。这是我的代码:

function Foo() {

    this.num=0;
    $('element').click(this.eventHandler);// jQuery to attach an onclick event to my element.

    this.eventHandler=function() {
        this.num++;// This doesn't work.
        // Normally, "this" would refer to my instance of Foo,
        // but as an event handler, "this" refers to the html element.
    }
}

所以我的问题是:如何将我的 Foo 实例引用到我的事件处理程序中,以便我可以修改它的属性(如num)?

4

4 回答 4

15
function Foo() {
    var _self = this;
    this.num=0;

    $('element').click(this.eventHandler);// jQuery to attach an onclick event to my element.

    this.eventHandler=function() {
        _self.num++;
    }
}

使用_self = this在外部范围中定义的引用

于 2012-05-18T16:12:07.003 回答
15

您需要绑定函数的上下文;否则this将是全局对象:

$('element').click($.proxy(this.eventHandler, this));

在现代浏览器中,您还可以使用Function.prototype.bind

$('element').click(this.eventHandler.bind(this))
于 2012-05-18T16:15:54.723 回答
2
function Foo() {
   this.num=0;
   $(document).on('click', 'element', this, this.eventHandler);
   this.eventHandler=function(e) {
      var _this = e.data; 
      _this.num++;
   }
}

1) 使用 JQuery on() 方法附加事件监听器。2) 使用引用 _this 来访问父类。

于 2015-02-16T11:09:42.667 回答
1

您可以this在构造函数中存储一个引用,您可以在事件处理程序中访问该引用。

function Foo() {

    this.num=0;
    $('element').click(this.eventHandler);// jQuery to attach an onclick event to my element.

    var that = this;
    this.eventHandler=function() {
        that.num++;// This doesn't work.
    }
}
于 2012-05-18T16:12:15.303 回答