sqrt(vmax**2 + vmin**2) - vmax
let originalFunc = function(min, max) { /*...*/ }
function decorator(func) {
let cache = new Map;
// в func здесь у нас оригинальная функция originalFunc
return function decorated() { // Имя здесь не нужно, просто для ясности
// это декоратор (обертка) для нашей оригинальной функции
// этот декоратор и будем вызывать позже
// передавая в него min и max,
// которые как раз и попадут в arguments этой функции
// ну тут дальше что-то делаем
// Потом вызываем оригинал
let result = func.call(this, ...arguments);
// Еще что-то делаем с результатом
// и возвращаем результат
return result;
}
}
// Декорируем оригинальную функцию
const decoratedFunc = decorator(originalFunc);
let cache = new Map;
function decoratedFunc() {
// это декоратор (обертка) для нашей оригинальной функции
// этот декоратор и будем вызывать позже
// передавая в него min и max,
// которые как раз и попадут в arguments этой функции
// ну тут дальше что-то делаем
// Потом вызываем оригинал
let result = func.call(this, ...arguments);
// Еще что-то делаем с результатом
// и возвращаем результат
return result;
}
// Декорируем оригинальную функцию
originalFunc = decorator(originalFunc);
originalFunc(3, 5)
cacheDecorator
вызывается один раз, здесьworker.slow = cachingDecorator(worker.slow, hash);
let worker = {
slow(min, max) {
alert(`Called with ${min},${max}`);
return min + max;
}
};
function cachingDecorator(func, hash) {
let cache = new Map();
return function decoratedSlow() { // ЭТА ФУНКЦИЯ ПОТОМ БУДЕТ ВЫЗЫВАТЬСЯ
let key = hash(arguments); // (*)
if (cache.has(key)) {
return cache.get(key);
}
let result = func.call(this, ...arguments); // (**)
cache.set(key, result);
return result;
};
}
function hash(args) {
return args[0] + ',' + args[1];
}
const decoratedSlowFunc = cachingDecorator(worker.slow, hash);
alert( decoratedSlowFunc(3, 5) ); // работает
alert( "Again " + decoratedSlowFunc(3, 5) );
display: none