SecurityYourFingers
@SecurityYourFingers
I make other things, but i know that without your

Как сделать такой вызов функций?

Есть калькулятор, вызов методов которого можно осуществлять следующим образом:

console.log(Calculator.getResult()); // 0

Calculator.add(4)(1);

console.log(Calculator.getResult()); // 5

Calculator.subtract(1)(1)(1)(2);

console.log(Calculator.getResult()); // 0

Калькулятор - фул код
function Calc(){
  var res = 0;
  return {
    add: function add(x){
      if (!isNaN(x)) res += x;
      return add;
    },
    subtract: function sub(x){
      if (!isNaN(x)) res -= x;
      return sub;
    },
    divide: function div(x){
      if ((!isNaN(x)) && (x !== 0)) res /= x;
      return div;
    },
    multiply: function mult(x){
      if (!isNaN(x)) res *= x;
      return mult;
    },
    getResult: function (){
      return res;
    },
    reset: function (){
      res = 0;
      return res;
    }
  }
}
var Calculator = new Calc();
module.exports = Calculator;

Необходимо модифицировать данный код, чтобы был возможен вызов методов следующим образом:

const result = Calculator.add(100)
    .multiply(2)
    .divide(20)
    .reset()
    .subtract(1)
    .getResult();

console.log(result); // -1


Как это осуществить? Что вообще происходит (должно происходить) при таком вызове?
  • Вопрос задан
  • 552 просмотра
Решения вопроса 2
0xD34F
@0xD34F Куратор тега JavaScript
Возвращайте this из всех методов. Кроме getResult, конечно.
Ответ написан
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
function Calc() {
    let v = 0;
    const proto = {
        add(x) { v += x; },
        subtract(x) { v -= x; },
        divide(x) { x && (v /= x); },
        multiply(x) { v *= x; }
    };
    const keys = Object.keys(proto);
    const ctx = keys.reduce((acc, key) => {
        const wrap = x => ((!isNaN(x) && proto[key](Number(x))), wrap);
        return ((acc[key] = wrap), acc);
    }, {
        getResult: () => v,
        reset: () => ((v = 0), ctx)
    });
    keys.forEach(key => Object.assign(ctx[key], ctx));
    return ctx;
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы