【问题标题】:Javascript pseudo-classes, jQuery event handlers and 'this'Javascript 伪类、jQuery 事件处理程序和“this”
【发布时间】:2011-08-09 19:50:05
【问题描述】:

我有一个大型 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()的元素?

【问题讨论】:

  • @Javier JavaScript 没有类。所以它是一个伪类。
  • OO,类和其他东西是设计概念,不是语言特性
  • 当然是语言特性,有些语言支持不同类型的继承等。

标签: javascript jquery oop


【解决方案1】:

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

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();
    });
}

【讨论】:

  • 现在很明显 :) 只是为了记录,没有必要将调用包装在一个函数中,如果你传递 context.doSomething2(不带括号)它会做同样的事情
  • 我同意,但我喜欢将点击事件参数与实例方法参数分开。
【解决方案2】:
this.doSomething2 = $.proxy(function() {
    var x = this.doSomething() + " world";
    alert(x);
}, this);

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

【讨论】:

    【解决方案3】:

    在外部范围内保存对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 返回后也可以访问它们的值。这允许我们通过引用我们分配给that 的实例来访问doSomething 方法。

    【讨论】:

    • 是的,这行得通。我唯一要推荐的是,既然你已经在缓存上下文,为什么不到处使用它而不是一个地方。只是我的 2 美分...
    • @Eli 我个人不喜欢到处使用缓存的上下文。我更喜欢只在不能使用this 的地方使用that。最好将方法绑定到this
    猜你喜欢
    • 1970-01-01
    • 2021-04-10
    • 2011-10-05
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-10
    相关资源
    最近更新 更多