1

我正在使用 JQuery (Mobile) 创建一个应用程序,但我遇到了 JQuery 事件结构的问题。我定义了一个像这样的虚拟“类”:

MyClass = function()
{
    this.property = initvalue;

    this.foo = function()
    {
        alert("That's my property = " + this.property);
    }
}

然后我基于MyClass定义了一个对象:

var obj1 = new MyClass();

当我使用 obj1.foo() 作为回调函数来通知事件时,问题就来了,例如:

$(element).click(obj1.foo);

或者

$(element).load(URL, obj1.foo);

执行 foo() 时,“this”指的是元素,而不是对象“obj1”,当然我不能通过自引用访问对象的“属性”。我该如何解决?

4

3 回答 3

0

您可以将方法绑定到其实例:

$(element).click(obj1.foo.bind(obj1));

.bind()方法返回一个函数,因此您仍在将一个函数传递给 jQuery 方法,但是该函数的上下文将绑定到您传递给.bind().

如果需要支持旧版浏览器,可以使用之前链接的 MDN 文章中给出的 polyfill,也可以使用 jQuery$.proxy方法。

于 2013-02-15T16:09:22.030 回答
0

您可以使用 jQUery 的proxy方法:

$(element).load(URL, $.proxy(obj1.foo, obj1));

这会将obj1上下文分配给您的方法。

于 2013-02-15T16:10:15.243 回答
0

您可以将 click 事件绑定到引用this对象上下文中的缓存版本的匿名函数。

var myClass = this;
$(element).click(function () { myClass.foo(); });

一般来说,使用此方法比库提供的替代方法(如 $.bind、$.proxy 和 _.bindAll)更有效(尽管在您当前的示例中,我认为性能是相当的)。请参阅这篇关于上下文绑定的文章。

于 2013-02-15T16:26:07.440 回答