【发布时间】:2010-01-17 02:00:07
【问题描述】:
A 类(我的)为 B 类(第 3 方)实现事件处理程序。在这些事件处理程序中,我想访问 A 类的属性。
在 A 类的处理程序中使用 this 不起作用,因为它引用了 B 类的范围。
全局变量似乎是唯一的选择。我错过了更好的选择吗?
【问题讨论】:
标签: javascript
A 类(我的)为 B 类(第 3 方)实现事件处理程序。在这些事件处理程序中,我想访问 A 类的属性。
在 A 类的处理程序中使用 this 不起作用,因为它引用了 B 类的范围。
全局变量似乎是唯一的选择。我错过了更好的选择吗?
【问题讨论】:
标签: javascript
创建一个self 或that 变量,其中包含对this 的引用。像这样的:
var ClassA = function () {
var self = this;
this.MyProperty1 = 3;
self.MyProperty2 = "hello world";
var ClassB_EventHandler = function () {
self.MyProperty1;
self.MyProperty2;
}
}
您可以在ClassA 的范围内交替使用this 和self。在ClassB 事件处理程序中,您需要使用self 来引用ClassA 属性。
【讨论】:
另一个解决方案是将您的事件处理程序绑定到您的对象!
您首先需要将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
【讨论】: