Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to pass object's method as a parameter in Javascript

Can't figure out how to pass object's method as a parameter properly.

Here is my code:

var MyTest = function (p1) {
  this.p1 = p1;
};
MyTest.prototype.getParam = function () {
  return this.p1;
};

function doAction(getParamCallback) {
  console.log(getParamCallback());
}

var mt = new MyTest(123);
console.log(mt.getParam()); // 123
doAction(mt.getParam);      // undefined

The only way to pass a method correctly I have found is to pass both object and method and use call():

function doAction2(obj, getParamCallback) {
  console.log(getParamCallback.call(obj));
}
doAction2(mt, mt.getParam);    // 123

Is there any way that requires only method to be passed, not both method and object?

like image 424
xtx Avatar asked Dec 29 '15 05:12

xtx


1 Answers

You need to pass the this context as well. In provided example, methos is being called in the context of window, and window does not have property p1

Use .bind() to pass the context. bind returns a function that when later executed will have the correct context set for calling the original function. This way you can maintain context in async callbacks, and events.[Reference]

Try this:

var MyTest = function(p1) {
  this.p1 = p1;
};
MyTest.prototype.getParam = function() {
  return this.p1;
};

function doAction(getParamCallback) {
  alert(getParamCallback());
}

var mt = new MyTest(123);

doAction(mt.getParam.bind(mt));
like image 172
Rayon Avatar answered Nov 11 '22 06:11

Rayon