Class A (mine) implements event handlers for class B (3rd party). Within these event handlers, I would like to access class A's properties.
Using this in class A's handlers does not work because it references class B's scope.
Global variables seem like the only option. Am I missing a better alternat开发者_JAVA百科ive?
Create a self
or that
variable, which holds a reference to this
. Something like this:
var ClassA = function () {
var self = this;
this.MyProperty1 = 3;
self.MyProperty2 = "hello world";
var ClassB_EventHandler = function () {
self.MyProperty1;
self.MyProperty2;
}
}
You can use this
and self
interchangeably in ClassA
's scope. In the ClassB
event handler, you'll be required to use self
to reference ClassA
properties.
Another solution is to bind your event handlers to your object!
You first need the add the bind
method to any function object. Use this code:
Function.prototype.bind = function(scope) {
var func = this;
return function() {
return func.apply(scope, arguments);
}
}
Now you can register your class B
event handlers to your class A
methods this way:
var a = new A();
var b = new B();
b.registerEvent(a.eventHandlerMethod.bind(a));
This way any references to this
within the code of A.eventHandlerMethod
will point to object a
.
If you need a deeper understanding of this stuff you can read this great article: http://www.alistapart.com/articles/getoutbindingsituations/
Another article: http://alternateidea.com/blog/articles/2007/7/18/javascript-scope-and-binding
精彩评论