Задать вопрос
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

Как это осуществить? Что вообще происходит (должно происходить) при таком вызове?
  • Вопрос задан
  • 586 просмотров
Подписаться 1 Простой 2 комментария
Помогут разобраться в теме Все курсы
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
  • Академия Эдюсон
    Fullstack-разработчик на JavaScript + ИИ
    11 месяцев
    Далее
  • ProductStar × РБК
    Профессия: Инженер по тестированию + ИИ
    6 месяцев
    Далее
Решения вопроса 2
0xD34F
@0xD34F Куратор тега JavaScript
Возвращайте this из всех методов. Кроме getResult, конечно.

UPD. Нет, возвращаемые значения трогать не надо - что-то сразу не понял, что возможность несколько раз подряд вызывать метод после однократного обращения к нему по имени, должна остаться. Добавляем методам в качестве свойств ссылки на все методы:

function Calc() {
  let val = 0;
  const calc = {
    add: x => (isNaN(x) || (val += x), calc.add),
    sub: x => (isNaN(x) || (val -= x), calc.sub),
    mul: x => (isNaN(x) || (val *= x), calc.mul),
    div: x => (isNaN(x) || !x || (val /= x), calc.div),
    reset: () => (val = 0, calc),
    result: () => val,
  };
  const t = Object.entries(calc);
  t.forEach(n => t.forEach(([ k, v ]) => n[1][k] = v));
  return calc;
}

const calc = Calc();
calc.add(1)(2)(3).sub(4).mul(5)(6).result(); // 60
Ответ написан
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;
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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