3

通常(如果不总是),当 jQuery 允许您向某些 JS 事件(如 click)添加回调时,在回调函数中,它们会将“含义”更改为this触发事件的 DOM 元素。

这可能非常有用,但是当您在 js 中编写 OOP 代码时,它会妨碍您,例如以下示例

function MyClass() {}

MyClass.prototype = {

    init: function() {
        $("#someSpan").click(this.doSomething);
    },

    doSomething: function() {
        alert("Here 1");
        this.test();
        return false;
    },

    test: function() {
        alert("Here 2");
    }
}

在这个例子中,this.test()将不起作用,因为this不再是一个实例,MyClass而是一个 jQuery DOM 元素(跨度)。

我的问题是:有没有办法继续使用这种模式在 JS 中编写 OOP 代码并使用 jQuery?this并且:当 jQuery 可以轻松地将 jQuery DOM 元素作为第一个参数发送时,为什么它会在回调函数中发生变化?

4

1 回答 1

5

jQuery$.proxy可以像这样使用:

function MyClass() {
    this.clicked = $.proxy(this.clicked, this);
}

MyClass.prototype = {

    clicked: function(e) {
        alert("Here 1");
        this.test();
        e.currentTarget; //this replaces "this"-the keyword used in "non OOP" contexts
//see http://api.jquery.com/event.currentTarget/
    },

    init: function() {
        $("#someSpan").click(this.clicked);
    },

    test: function() {
        alert("Here 2");
    }
}

当您创建一个实例时,该实例会获得自己的.clicked函数,该函数会影响原型中的通用函数。this无论您如何称呼它,它都将始终具有相同的绑定。所以你可以this.clicked到处走走,让它发挥作用。

于 2012-06-25T22:35:31.260 回答