Method chaining in JavaScript – Part 2

Showcase a working demo of method chaining in JavaScript by implementing the following example.

Example

Input:
computeAmount().lacs(15).crore(5).crore(2).lacs(20).thousand(45).crore(7).value();

Output:
143545000

We have already seen an example of method chaining in which we used object-based and function-based implementations.

Similarly we will solve this problem with different approaches.

Method 1: Using function as constructor

We will create a constructor function that will help us to create a new instance every time and perform the operations.

const ComputeAmount = function(){
  this.store = 0;
  
  this.crore = function(val){
    this.store += val * Math.pow(10, 7);
    return this;
  };
  
  this.lacs = function(val){
    this.store += val * Math.pow(10, 5);
    return this;
  }
  
  this.thousand = function(val){
    this.store += val * Math.pow(10, 3);
    return this;
  }
  
  this.hundred = function(val){
    this.store += val * Math.pow(10, 2);
    return this;
  }
  
  this.ten = function(val){
    this.store += val * 10;
    return this;
  }
  
  this.unit = function(val){
    this.store += val;
    return this;
  }
  
  this.value = function(){
    return this.store;
  }
}
Input:
const computeAmount = new ComputeAmount();
const amount = computeAmount.lacs(15).crore(5).crore(2).lacs(20).thousand(45).crore(7).value();
console.log(amount === 143545000);

Output:
true

Method 2: Using function as closure

We will form closure and return a new object from it that will have all the logic encapsulated.

const ComputeAmount = function(){
  
  return {
    store: 0,
    crore: function(val){
      this.store += val * Math.pow(10, 7);
      return this;
    },

    lacs: function(val){
      this.store += val * Math.pow(10, 5);
      return this;
    },

    thousand: function(val){
      this.store += val * Math.pow(10, 3);
      return this;
    },

    hundred: function(val){
      this.store += val * Math.pow(10, 2);
      return this;
    },

    ten: function(val){
      this.store += val * 10;
      return this;
    },

    unit: function(val){
      this.store += val;
      return this;
    },

    value: function(){
      return this.store;
    }
  }
}
Input:
const amount = ComputeAmount().lacs(9).lacs(1).thousand(10).ten(1).unit(1).value();
console.log(amount === 1010011);

const amount2 = ComputeAmount().lacs(15).crore(5).crore(2).lacs(20).thousand(45).crore(7).value();
console.log(amount2 === 143545000);

Output:
true
true