Jay
Jay

Reputation: 237

this in event handlers for another object

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

Answers (2)

Andrea Zilio
Andrea Zilio

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

Dan Herbert
Dan Herbert

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

Related Questions