【问题标题】:this in event handlers for another objectthis 在另一个对象的事件处理程序中
【发布时间】:2010-01-17 02:00:07
【问题描述】:

A 类(我的)为 B 类(第 3 方)实现事件处理程序。在这些事件处理程序中,我想访问 A 类的属性。

在 A 类的处理程序中使用 this 不起作用,因为它引用了 B 类的范围。

全局变量似乎是唯一的选择。我错过了更好的选择吗?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    创建一个selfthat 变量,其中包含对this 的引用。像这样的:

    var ClassA = function () {
        var self = this;
    
        this.MyProperty1 = 3;
        self.MyProperty2 = "hello world";
    
        var ClassB_EventHandler = function () {
            self.MyProperty1;
            self.MyProperty2;
        }
    
    }
    

    您可以在ClassA 的范围内交替使用thisself。在ClassB 事件处理程序中,您需要使用self 来引用ClassA 属性。

    【讨论】:

    • 这应该与原型一起使用吗?我最初尝试过,但似乎没有用。
    【解决方案2】:

    另一个解决方案是将您的事件处理程序绑定到您的对象!

    您首先需要将bind 方法添加到任何函数对象。使用此代码:

    Function.prototype.bind = function(scope) {
      var func = this;
    
      return function() {
        return func.apply(scope, arguments);
      }
    }
    

    现在您可以通过这种方式将您的 class B 事件处理程序注册到您的 class A 方法中:

    var a = new A();
    var b = new B();
    
    b.registerEvent(a.eventHandlerMethod.bind(a));
    

    这样A.eventHandlerMethod 的代码中对this 的任何引用都将指向对象a

    如果您需要更深入地了解这些内容,可以阅读这篇精彩的文章:http://www.alistapart.com/articles/getoutbindingsituations/

    另一篇文章:http://alternateidea.com/blog/articles/2007/7/18/javascript-scope-and-binding

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-13
      • 1970-01-01
      • 2011-05-26
      • 2015-06-26
      • 2010-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多