Một polyfill là một shim thay thế cuộc gọi ban đầu bằng cuộc gọi đến shim.
Ví dụ: giả sử bạn muốn sử dụng đối tượng navigator.mediaDevices, nhưng không phải tất cả các trình duyệt đều hỗ trợ điều này. Bạn có thể tưởng tượng một thư viện cung cấp một shim mà bạn có thể sử dụng như thế này:
<script src="js/MediaShim.js"></script>
<script>
MediaShim.mediaDevices.getUserMedia(...);
</script>
Trong trường hợp này, bạn rõ ràng đang gọi một shim thay vì sử dụng đối tượng hoặc phương thức ban đầu. Polyfill, mặt khác, thay thế các đối tượng và phương thức trên các đối tượng ban đầu.
Ví dụ:
<script src="js/adapter.js"></script>
<script>
navigator.mediaDevices.getUserMedia(...);
</script>
Trong mã của bạn, có vẻ như bạn đang sử dụng đối tượng navigator.mediaDevices tiêu chuẩn. Nhưng thực sự, polyfill (trong ví dụ của adapter.js) đã thay thế đối tượng này bằng đối tượng của chính nó.
Một trong những nó đã thay thế nó là một shim. Điều này sẽ phát hiện nếu tính năng này được hỗ trợ nguyên bản và sử dụng nó nếu có, hoặc nó sẽ hoạt động xung quanh nó bằng các API khác nếu không.
Vì vậy, một polyfill là một loại shim "trong suốt". Và đây là ý nghĩa của Remy Sharp (người đặt ra thuật ngữ này) khi nói rằng " nếu bạn xóa tập lệnh polyfill, mã của bạn sẽ tiếp tục hoạt động, mà không có bất kỳ thay đổi nào được yêu cầu mặc dù đã xóa bỏ polyfill ".