'how to concatenate function with javascript closure and object

i'm trying to find a solution to this exercise:

Implement the calculate function that adds an object that gives the ability to do the four mathematical operations (addition, subtraction, multiplication and division) on the same number and finally print out the result.

function calculate() {

}

const calculator = calculate();
calculator.add(2).add(4).multiply(3).sub(1).sub(3).divide(2).printResult(); // result will be: 7
console.log(calculator)

so, what is the right way to solve this (and if you can add comment will be appreciated



Solution 1:[1]

no need to put so many this and function...

in this way you have a closure value.
=> calc_00.val = 20;
will not change the result (it just add a new property if jso is not freeze ) or throw an error in strict mode

"use strict";

function calculate( initVal = 0 )  // default value is zero
  {
  let
    val = initVal    // closure value
  , jso =
    { add(v)         { val += v; return this }
    , sub(v)         { val -= v; return this }
    , multiply(v)    { val *= v; return this }
    , divide(v)      { val /= v; return this }
    , printResult()  { return val }
    }
  Object.freeze(jso)
 
  return jso
  }

const
  calc_00 = calculate()
, calc_10 = calculate(10)
  ;

// calc_00.yop = ()=>null; // Uncaught TypeError: can't define property "yop": Object is not extensible
// calc_00.sub = ()=>null; // Uncaught TypeError: "sub" is read-only
// calc_00.val = 20;       // Uncaught TypeError: can't define property "val": Object is not extensible

calc_00.add(2).add(4).multiply(3).sub(1).sub(3).divide(2);
calc_10.add(10).multiply(3);

console.log( calc_00.printResult(), calc_10.printResult() ) // 7 , 60

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1