Reputation: 237
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 alternative?
Upvotes: 2
Views: 181
Reputation: 4534
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
Upvotes: 2
Reputation: 103387
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.
Upvotes: 5