Попытка выучить функциональные миксины - PullRequest
0 голосов
/ 31 августа 2018

У меня есть функция калькулятора:

var Calculator = function(a, b) { 
  this.add = function(a, b) { return a + b; }; 
  this.multiply = function(a, b) { return b * a; }; 
  this.subtract = function(a, b) { return a - b; }; 
  this.divide = function(a, b) { 
    if (a/b === Infinity) {
      return Infinity - Infinity; 
    } else return a/b; 
  }; 
};

Я хочу создать функциональный миксин для 'sum' (Calculator.sum), поэтому, если я передам в него "1,2,3,4", он вернет 10, но не будет свойством Calculator

Может кто-нибудь объяснить, как это можно сделать?

1 Ответ

0 голосов
/ 31 августа 2018

Предположим, вы говорите о шаблоне функциональный миксин , описанном здесь :

const withSum = (object) => {
  return Object.assign({}, object, {
    sum(...args) {
      return args.reduce((sum, number) => sum + number, 0);
    }
  });
};

var Calculator = function(a, b) { 
  this.add = function(a, b) { return a + b; }; 
  this.multiply = function(a, b) { return b * a; }; 
  this.subtract = function(a, b) { return a - b; }; 
  this.divide = function(a, b) { 
    if (a/b === Infinity) {
      return Infinity - Infinity; 
    } else return a/b; 
  }; 
};

var calculator = withSum(new Calculator(1, 2));

console.log('calculator.add(1, 2):', calculator.add(1, 2));
console.log('calculator.multiply(1, 2):', calculator.multiply(1, 2));
console.log('calculator.subtract(2, 1):', calculator.subtract(2, 1));
console.log('calculator.divide(1, 2):', calculator.divide(1, 2));
console.log('calculator.sum(1, 2, 3, 4): ', calculator.sum(1, 2, 3, 4));

Обратите внимание, что если ваш Calculator.divide должен возвращать NaN, если a/b === Infinity, вы можете просто написать return NaN; вместо Infinity - Infinity (NaN является глобальной константой).

Кроме того, вы можете удалить список формальных параметров, объявленный в конструкторе Calculator: достаточно function Calculator() {...}, поскольку вы никогда не используете a, b.

...