不能直接在全局对象上扩充原型对象来添加 Polyfill 方法,因为全局对象不是构造函数;正确做法是向 Array.prototype 等内置构造函数的 prototype 添加方法,如补全 includes。

JavaScript 中不能直接在全局对象(如 window 或 globalThis)上“扩充原型对象”来添加 Polyfill 方法——因为全局对象本身不是构造函数,没有原型链意义上的“原型对象”供你修改;真正能被 Polyfill 的是内置构造函数的原型(如 Array.prototype、String.prototype、Date.prototype 等),它们的实例方法才可通过原型链被所有实例继承。
✅ 正确做法:向内置构造函数的 prototype 添加方法
比如为老浏览器补全 Array.prototype.includes:
[1,2,3]
- 可能与未来标准或框架冲突(如将来 DOM 规范新增同名方法)
- 非标准扩展无法被 TypeScript 类型系统识别,需手动声明
- 服务端环境(Node.js)中没有
window,需用globalThis,但行为不统一
? 安全补充全局能力的替代方案
如果真需要一个全局可用的自定义工具函数(非实例方法),推荐以下方式:
-
挂载到
globalThis(现代且跨环境):globalThis.myPolyfill = function() { /*...*/ };
所有环境(浏览器/Node.js/Deno)都可访问myPolyfill() -
使用 IIFE 封装,避免命名污染:
(function() { if (!globalThis.foo) globalThis.foo = ... })(); -
配合类型声明(TypeScript):
在global.d.ts中扩展:declare global { interface GlobalThis { myPolyfill(): void; } }
? 小结关键点
- “原型对象” Polyfill 针对的是
XXX.prototype,不是window或globalThis本身 - 数组、字符串、日期、对象等内置类型的实例方法,都靠改写其
prototype实现兼容 - 全局函数级 Polyfill 应优先用
globalThis,而非硬写window.xxx - 所有 Polyfill 务必先检测原生支持再定义,防止覆盖或重复定义
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











