Как написать класс с оператором функция() в javascript?

Я хочу подсунуть foreach-у функтор (то есть функцию, у которой есть память, это нужно для того, чтобы она суммировала все значения массива). Я пробовал делать через class и у меня не получилось (или выходило nan или вместо правильной суммы выходило 0). Но у меня получилось сделать вот так - я описал простую функцию, но так как функции они тоже объекты, я потом добавил в объект-функцию поле summ и также метод clear, чтоб перед использованием стереть на ноль summ (если вдруг раньше эта функция была кем то использована, то там останется предыдущая сумма). Вопрос же у меня вот какой - как это переписать с использованием class?


function functor(val) {
functor.summ = functor.summ + val;
}

functor.summ = 0;
functor.clear = function () { functor.summ = 0;};


let arr1 = [1, 2, 3];


functor.clear();

arr1.forEach( functor );

console.log(functor.summ);


Ответы (1 шт):

Автор решения: Timur123

Мне помогла функция bind.

class CoolFunctor {
summ = 0;   
constructor(){}
add(val) {this.summ = this.summ + val;}
}

let arr1 = [1, 2, 3];

let functor1 = new CoolFunctor();


// это не работает, так как this внутри add привязывается не к CoolFunctor,а к arr1.
// arr1.forEach( functor1.add );

// здесь мы привязываем this внутри метода add конкретно к экземпляру functor1
//поэтому это работает как надо
let binded_method_to_concrete_instance = functor1.add.bind(functor1);
arr1.forEach( binded_method_to_concrete_instance );


console.log(functor1.summ);

→ Ссылка