Добавить декоратор к функции
Используя прототип класса Addition добавить декоратор к функции add, дающий возможность логировать ее вызов При этом результат выполнения add должен быть как и в оригинале, но дополнительно при вызове выводить в консоль 'called' Менять изначальную функцию, класс или созданный объект нельзя.
class Addition {
constructor (num) {
this.num = num;
}
add (...nums) {
const sum = (a, b) => a + b;
return this.num + nums.reduce(sum);
}
}
Ответы (2 шт):
Если следовать строго задаче, можно получить следующее:
Используя прототип класса Addition добавить декоратор к функции add
нужно взять текущую функцию из прототипа
var add = Addition.prototype.addсделать для нее обертку
Addition.prototype.add = function(...) {... /* вызов add */ ...}в обертке добавить логирование
Addition.prototype.add = function(...) { console.log('called'); /* вызов add */ }
Чтобы вызов add работал как раньше, достаточно при вызове установить контекст в текущий элемент передав this.
В итоге код может выглядеть так:
class Addition {
constructor(num) {
this.num = num;
}
add(...nums) {
const sum = (a, b) => a + b;
return this.num + nums.reduce(sum);
}
}
var a = new Addition(5);
console.log(a.add(1, 2, 3))
var add = Addition.prototype.add;
Addition.prototype.add = function(...nums) {
console.log('called');
return add.call(this, ...nums);
}
var b = new Addition(2);
console.log(b.add(1, 2, 3))
console.log(a.add(1, 2, 3))
// декоратор
const decorWithLog = func => function(...args) {
console.log('called');
func.call(this, ...args);
}
class Addition {
constructor (num) {
this.num = num;
}
add (...nums) {
const sum = (a, b) => a + b;
return this.num + nums.reduce(sum);
}
}
// переопределяем метод add на декорированый метод
Addition.prototype.add = decorWithLog(Addition.prototype.add);