Javascript伪类,jQuery事件处理程序和'this'

时间:2011-04-20 20:33:14

标签: javascript jquery oop

我有一个很大的Javascript项目,我正在尝试重构为伪类:

jsFiddle:http://jsfiddle.net/waitinforatrain/7T42w/

var MyNameSpace = {}

MyNameSpace.MyClass = function() {
    this.doSomething = function () {
        return "hello";
    }

    this.doSomething2 = function() {
        var x = this.doSomething() + " world";
        alert(x);
    }

    this.doSomething2(); //Works fine

    $("#mydiv").click ( this.doSomething2 ); //Doesn't work
}

var class = new MyNameSpace.MyClass();

点击事件导致错误的原因是this引用#mydiv元素。

我应该如何设计上述内容,以便我可以访问被点击的元素,但也可以调用doSomething()

3 个答案:

答案 0 :(得分:6)

您需要缓存上下文引用并将调用包装在闭包中:

var MyNameSpace = {}

MyNameSpace.MyClass = function() {
    var context = this;

    context.doSomething = function () {
        return "hello";
    }

    context.doSomething2 = function() {
        var x = context.doSomething() + " world";
        alert(x);
    }

    // You can do this:
    context.doSomething2();

    // Or this:
    $("#mydiv").click(function(e) {
        context.doSomething2();
    });
}

答案 1 :(得分:2)

this.doSomething2 = $.proxy(function() {
    var x = this.doSomething() + " world";
    alert(x);
}, this);

$ .proxy将this范围绑定到所述函数内的上下文变量。

答案 2 :(得分:0)

在外部范围内保存对this的引用:

MyNameSpace.MyClass = function() {

    var that = this;

    this.doSomething = function () {
        return "hello";
    }

    this.doSomething2 = function() {
        var x = that.doSomething() + " world";
        alert(x);
    }

    this.doSomething2(); //Works fine

    $("#mydiv").click ( this.doSomething2 ); //Doesn't work
}

分配给doSomething2的函数被称为“关闭”其词法范围中的变量,因此即使MyClass返回,也可以访问它们的值。这允许我们通过对我们分配给doSomething的实例的引用来访问that方法。