Chain custom javascript functions

KJdev picture KJdev · Jan 27, 2016 · Viewed 8.1k times · Source

After searching for quite some time, I still haven't found what I'm looking for.

There's a fair amount of examples that either require creating a new instance, or only have functions that don't return anything (which means the problem can be solved with returning this).

I hope the following example illustrates my point well:

// Say I have these functions
function aNumber(){
    var max = 100, min = 0;
    return (Math.floor(Math.random() * (max - min + 1)) + min);
}
function divideBy(_number, _divider){
    return (_number / _divider);
}
function multiplyBy(_number, _multi){
    return (_number * _multi);
}
function add(_number, _add){
    return (_number + _add);
}
function subtract(_number, _sub){
    return (_number - _sub);
}

// #########################################################

// I can do this with them
var test = aNumber();
test = divideBy(aNumber, 2);
test = add(aNumber, 5);
test = multiplyBy(aNumber, 3);
test = subtract(aNumber, 10);

// I would like to do this however:
var test = aNumber().divideBy(2).add(5).multiplyBy(3).subtract(10);

What would be the most efficient way to make the last line work?

Am I misinformed that this is possible without creating a new instance of something?

Answer

Praveen Kumar Purushothaman picture Praveen Kumar Purushothaman · Jan 27, 2016

Yes, this requires changing the Prototype of an Object. Objects are instances. So you need to create an object to do this kind of thing.

function MyNum(value) {
  this._val = value;      // Having _variable is for denoting it is a private variable.
}

Initialize objects using:

var myNum = new MyNum(5);

And now using this, define these:

MyNum.prototype.divideBy = function () {}
MyNum.prototype.multiplyBy = function () {}

Don't forget to use return this; inside these functions.