Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

why is this private method in a constructor?

I'm a bit puzzled by this coding pattern I've run into even though I've been studying up on 'this.' The following (simplified) code shows the pattern:

var MyConstructor = function MyConstructor() {
    this._handlers = {
        action: this.handleAction.bind(this)
    };
};

MyConstructor.prototype.start = function(someObj) {
    this.someObj.on(’some event’, this._handlers.action);  //<--here
}

MyConstructor.prototype.handleAction = function() {
    //do stuff
}

module.exports = MyConstructor;

My question is, why is the private method in the constructor required? Is this pattern avoid some common problem? Could the line commented //<--here simply be:

this.someObj.on(’some event’, this.handleAction);
like image 566
Dave Avatar asked Nov 19 '25 05:11

Dave


1 Answers

No, they are different. The difference is in context, which means the value of this within the function.

this.handleAction passes the function to on without any context. There is no value of this specified. The value will be determined when the function is executed. It is very likely that the value will not be the a MyConstructor object, so this.start, for instance, will not refer to the right object, or indeed perhaps any object at all.

The solution is to bind context. This sets the context forever, so this will always refer to the right value. You see this line of code:

action: this.handleAction.bind(this)

This means that, when the code later refers to this._handlers.action, it will be sending the function to on with the appropriate context, so this will always point to the correct value.

like image 107
lonesomeday Avatar answered Nov 21 '25 19:11

lonesomeday



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!