3

我用一个方法在 JavaScript 中定义了一个类:

function MyClass(text) {
    this.text = text;
}

MyClass.prototype.showText = function() {
    alert(this.text);
}

然后,我使用 jQuery 定义了一个方法,该方法充当单击事件的处理程序:

function MyClass(text) {
    this.text = text;
    $('#myButton').click(this.button_click);
}

MyClass.prototype.showText = function() {
    alert(this.text);
};

MyClass.prototype.button_click = function() {
    this.showText();
};

当我单击按钮时,它会说:

对象 #<HTMLInputElement> 没有方法 'showText'

似乎是this在 jQuery click 事件处理程序中引用 HTML 元素本身,而不是引用MyClass对象的实例。

我该如何解决这种情况?

可用的 jsFiddle:http: //jsfiddle.net/wLH8J/

4

2 回答 2

11

这是预期的行为,请尝试:

function MyClass(text) {
    var self = this;

    this.text = text;
    $('#myButton').click(function () {
      self.button_click();
    });
}

或在较新的浏览器中(使用bind):

function MyClass(text) {
    this.text = text;
    $('#myButton').click(this.button_click.bind(this));
}

或使用 jquery代理

function MyClass(text) {
    this.text = text;
    $('#myButton').click($.proxy(this.button_click, this));
}

进一步阅读:

于 2012-05-15T08:20:55.873 回答
2

this是在调用函数时确定的,而不是在定义函数时确定的。您已将该函数复制到单击处理程序,因此当它被调用时,它与它无关,MyClass也不this是您想要的。

您需要使用闭包将 的值存储this在不同的变量中。

function MyClass(text) {
    this.text = text;
    var self = this;
    var click_handler = function () { self.button_click(); };
    $('#myButton').click(click_handler);
}
于 2012-05-15T08:21:11.150 回答