Ну и разумным шагом было бы превратить Calculator в конструктор:
function Calculator(firstNumber) {
if(!(this instanceof Calculator)) return new Calculator(firstNumber);
this.firstNumber = firstNumber;
}
Calculator.prototype = {
sum: function() {
let result = this.firstNumber;
for(let i = 0; i < arguments.length; i++) {
result += arguments[i];
}
return result;
},
dif: function() {
let result = this.firstNumber;
for(let i = 0; i < arguments.length; i++) {
result -= arguments[i];
}
return result;
},
div: function() {
let result = this.firstNumber;
for(let i = 0; i < arguments.length; i++) {
if (arguments[i] == 0) {
throw new Error('Делитель равен нулю');
} else {
result /= arguments[i];
}
}
return result;
},
mul: function() {
let result = this.firstNumber;
for(let i = 0; i < arguments.length; i++) {
result *= arguments[i];
}
return result;
},
}
module.exports = Calculator;
Разница с вашим вариантом(кроме исправления result) в том, что для каждого новосозданного объекта будут использованы одни и те же функции, без копирования, тогда как у вас каждый раз они создаются заново.
Но, опять же, использовать это имеет смысл, если вы проходили что такое прототипы.)
P.S. На счёт оптимальных первых двух задач - вопрос тонкий, ибо в современном js существуют нативные
some и
every.