Skip to content Skip to sidebar Skip to footer

'this' Keyword Overriden In JavaScript Class When Handling JQuery Events

I have defined a class in JavaScript with a single method: function MyClass(text) { this.text = text; } MyClass.prototype.showText = function() { alert(this.text); } Then

Solution 1:

That's an expected behaviour, try:

function MyClass(text) {
    var self = this;

    this.text = text;
    $('#myButton').click(function () {
      self.button_click();
    });
}

or in newer browsers (using bind):

function MyClass(text) {
    this.text = text;
    $('#myButton').click(this.button_click.bind(this));
}

or using jquery proxy:

function MyClass(text) {
    this.text = text;
    $('#myButton').click($.proxy(this.button_click, this));
}

further reading:


Solution 2:

this is determined when a function is called, not when it is defined. You have copied the function to the click handler, so when it is called it isn't associated with MyClass and this isn't what you want it to be.

You need to use a closure to store the value of this in a different variable.

function MyClass(text) {
    this.text = text;
    var self = this;
    var click_handler = function () { self.button_click(); };
    $('#myButton').click(click_handler);
}

Post a Comment for "'this' Keyword Overriden In JavaScript Class When Handling JQuery Events"