В настоящее время я работаю над "JS track - react project" на сайтеexperimentism.io (нет, не реагирую). Упражнение состоит в том, чтобы классы реагировали на действия друг друга. Я не был уверен, что наследование было лучшим вариантом, но я чувствую, что это так близко, как я собираюсь получить. (P.S. Это мой первый пост здесь, я перепробовал немало мест, прежде чем решил задать здесь свой первый вопрос. ('P.P.S.') => 'Howdy' :)
`class InputCell extends EventEmitter {
constructor(value) {
super(value);
this.value = value;
}
setValue(value) {
this.value = value;
// I'm assuming this emitter doesn't leave the scope of the object it creates?
this.emit('cellChange');
}
}
class ComputeCell extends InputCell {
constructor(cells, compute) {
super(cells, compute);
this.value = compute(cells);
// super wasn't my first choice, but 'this' didn't work either
super.on('cellChange', () => compute(cells));
}
}`
Edit- Мои извинения, вот провальный тест, который я провёл.
` test('compute cells update value when inputs are changed', () => {
const inputCell = new InputCell(1);
const computeCell = new ComputeCell(
[inputCell], inputs => inputs[0].value + 1
);
inputCell.setValue(3);
expect(computeCell.value).toEqual(4);
});
`
Нет, наследование кажется неправильным выбором, если вы хотите прослушивать события объекта Другая. Эмиттер событий там нормально. Похоже, ваш ComputeCell принимает в качестве аргумента массив InputCells, верно?
С другой стороны, наследование могло бы быть решением, и вы просто перезаписали бы метод setValue. Однако тогда вы бы не стали использовать события.
Извините, я должен был упомянуть тестовый сценарий для этого. Все, что он делает, это создает экземпляр каждого объекта, вызывает созданный экземпляр inputCell.setValue, а затем утверждает значение созданного экземпляра computeCell, чтобы увидеть, обновляется ли оно при вызове setValue () inputCell.
Да, как и ожидалось в моем втором комментарии. Нет, ComputeCell должен наследовать нет от InputCell, он должен использовать экземпляр InputCell, который он получает в конструкторе.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


@TJ Allen: Я застрял на том же упражнении, но нашел страницу с решениями: https://exercism.io/tracks/javascript/exercises/react/solutions
потребовалось некоторое время, но я нашел это объяснение достаточно простым для моего понимания (особенно для опубликованного вами тестового примера):
export class InputCell {
constructor(value) { // test 1: accepts input
this.value = value;
}
setValue(value) {
this.value = value; // test 2: allows input value to be set
}
}
export class ComputeCell {
constructor(inputCells, func) { // test 3: allows setting compute cells
this.inputs = inputCells;
this.func = func;
}
get value() {
return this.func(this.inputs); // test 5: compute cells update value when inputs are changed
}
}
Обратите внимание, что для других пользователей runningism.io я пропустил комментарий для тест 4:вычислительная ячейка принимает входные данные в правильном порядке, поскольку он был менее актуален для заданного здесь вопроса.
Обновлено: Лично я думаю, что формулировка этого конкретного случая теста 5 расплывчатый и запутанный.
"compute cells update value when inputs are changed"
Какие входы и где? Похоже, он просит вас использовать какой-то прослушиватель событий, чтобы значения внутри InputCell автоматически вызывали изменение значений внутри ComputeCell - bc. Я думал то же самое.
Но, глядя на тест, я думаю, что они на самом деле просят: если вы инициализируете новый экземпляр InputCell с номером и проходить этот экземпляр в качестве аргумента для создания нового экземпляра ComputeCell, тогда ваш новый экземпляр ComputeCell будет обновлен. его value (через геттер) основан на value экземпляра InputCell, который вы ему передали. Было бы понятнее, если бы в тестовом сообщении было что-то такое:
"compute cells return different value when called with new inputs"
все еще, вероятно, не так ясно, как хотелось бы, но менее вводит в заблуждение, imo.
"супер не был моим первым выбором, но "это" тоже не сработало" - какие не работает? Как вы создаете экземпляр, какие методы вызываете и чего ожидаете?