Как мы могли видеть во многих ответах здесь, прокладка - это своего рода адаптер, обеспечивающий функциональность на уровне API, которая не обязательно была частью этого API. В этой теме много хороших и полных ответов, поэтому я не буду расширять определение.
Однако, я думаю, я могу добавить хороший пример, который является Javascript ES5 Shim (https://github.com/es-shims/es5-shim):
Javascript сильно изменился за последние несколько лет, и среди многих других изменений в спецификации языка было добавлено много новых методов в его основные объекты.
Например, в спецификации ES2015 (он же ES5) метод find
был добавлен к прототипу Array
. Итак, предположим, что вы выполняете свой код с использованием движка JavasScript до этой спецификации (например, Node 0.12), который пока не предлагает этот метод. При загрузке прокладки ES5 эти новые методы будут добавлены в прототип Array
, что позволит вам использовать их, даже если вы не используете более новую спецификацию JavaScript.
Вы можете спросить: почему кто-то делает это вместо обновления среды до более новой версии (скажем, Узел 8)?
Существует много реальных сценариев, в которых такой подход имеет смысл. Один хороший пример:
Допустим, у вас есть устаревшая система, работающая в старой среде, и вам необходимо использовать такие новые методы для реализации / исправления функциональности. Обновление вашей среды все еще находится в стадии разработки, поскольку существуют проблемы совместимости, которые требуют большого количества изменений кода и тестов (критический компонент).
В этом примере вы можете попытаться создать собственную версию такой функциональности, но это сделает ваш код более трудным для чтения, более сложным, может привести к появлению новых ошибок и потребует тонны дополнительных тестов только для того, чтобы охватить функциональность, которую вы знаю, что это будет доступно в следующем выпуске.
Вместо этого вы можете использовать эту прокладку и использовать эти новые методы, используя тот факт, что это исправление / функциональность будет совместимым после обновления, поскольку вы уже используете методы, о которых известно, что они будут доступны в следующей спецификации. , И есть бонусная причина: поскольку эти методы являются родными для следующей спецификации языка, есть большая вероятность, что они будут работать быстрее, чем любая реализация, которую вы могли бы сделать, если бы попытались создать свою собственную версию.
Еще один реальный сценарий, где такой подход приветствуется, - на уровне браузера. Допустим, вам нужна поддержка старого браузера и вы хотите воспользоваться этими новыми функциями. Javascript - это язык, который позволяет добавлять / изменять методы в его основных объектах (например, добавлять методы в прототип Array), и эти библиотеки shim достаточно умны, чтобы добавлять такие методы, только если в текущей реализации их нет.
PS:
1) Вы увидите термин «Polyfill», связанный с этими прокладками Javascript. Polyfill - это более специализированный тип прокладок, который используется для обеспечения прямой совместимости в различных спецификациях уровня браузера. Кстати, мой пример выше относится именно к такому примеру.
2) Прокладки не ограничиваются этим примером (добавление функциональности, которая будет доступна в будущем выпуске). Существуют различные варианты использования, которые также считаются прокладкой.
3) Если вам интересно, как реализован этот конкретный полифильм, вы можете открыть спецификации Javascript Array.find и прокрутить до конца страницы, где вы найдете каноническую реализацию для этого метода.