---
sidebar_position: 9
---

# Декораторы и переадресация вызова, call/apply
Источник [https://learn.javascript.ru/call-apply-decorators](https://learn.javascript.ru/call-apply-decorators)

Декоратор – это обёртка вокруг функции, которая изменяет поведение последней. Основная работа по-прежнему выполняется функцией.

Обычно безопасно заменить функцию или метод декорированным, за исключением одной мелочи. Если исходная функция предоставляет свойства, такие как `func.calledCount` или типа того, то декорированная функция их не предоставит. Потому что это обёртка. Так что нужно быть осторожным в их использовании. Некоторые декораторы предоставляют свои собственные свойства.

Декораторы можно рассматривать как «дополнительные возможности» или «аспекты», которые можно добавить в функцию. Мы можем добавить один или несколько декораторов. И всё это без изменения кода оригинальной функции!

Для реализации `cachingDecorator` мы используем методы:
- `func.call(context, arg1, arg2…)` – вызывает `func` с данным контекстом и аргументами.
- `func.apply(context, args)` – вызывает `func`, передавая `context` как `this` и псевдомассив `args` как список аргументов.
  
В основном переадресация вызова выполняется с помощью apply:
```js
let wrapper = function(original, arguments) {
  return original.apply(this, arguments);
};
```
Весьма распространено заимствовать методы массива и применять их к arguments. В качестве альтернативы можно использовать объект с остаточными параметрами ...args, который является реальным массивом.

🚀 **Источник: [https://learn.javascript.ru/call-apply-decorators](https://learn.javascript.ru/call-apply-decorators)**