模块化不直接隔离原型链,但通过作用域限制、类封装、冻结原型和Object.create(null)等方式间接防止原型污染。

模块化本身不直接隔离原型链,但能间接避免原型污染和意外共享,关键在于控制对原型对象的访问与修改范围。
模块作用域天然限制原型修改传播
ES 模块(import/export)具有词法作用域和单例执行特性。在模块内部对原生原型(如 Array.prototype)的修改,仅在该模块的执行上下文中生效——前提是没被其他模块显式引入或全局污染。
- 每个模块拥有独立的顶层作用域,
const/let声明不会泄漏到全局 - 若某模块中执行
Array.prototype.myMethod = ...,该修改会作用于全局Array原型,**仍会影响所有模块**——因为原型是全局对象 - 真正受模块保护的是:你定义的构造函数、类、自定义原型对象,它们默认不会暴露到全局,也不会被其他模块无意覆盖
用类声明 + 模块封装替代直接操作原型
避免在模块中直接扩展原生类型原型;改用封装类或工具函数,把逻辑收束在模块边界内。
- 错误做法(污染全局):
// utils.js<br>Array.prototype.sum = function() { return this.reduce((a, b) => a + b, 0); }; - 推荐做法(模块内隔离):
// utils.js<br>export const sum = (arr) => arr.reduce((a, b) => a + b, 0);<br>export class SafeArray extends Array { /* 自定义行为,不影响原生 Array */ } - 使用时仅导入所需功能,不触发副作用,也不改变任何原型链结构
冻结关键原型防止跨模块篡改
在应用初始化阶段(如入口模块),主动冻结原生构造函数的 prototype,可阻断后续所有模块对它的修改尝试。
立即学习“Java免费学习笔记(深入)”;
Object.freeze(Array.prototype);Object.freeze(Object.prototype);Object.freeze(String.prototype);- 注意:需在任何第三方模块执行前调用,否则可能已遭污染;严格模式下非法修改会抛错
动态原型链隔离:用 Object.create(null) 构建纯净原型
当需要完全脱离内置原型链(比如实现沙箱对象、配置合并器、轻量级字典),可主动切断与 Object.prototype 的连接。
const cleanMap = Object.create(null); // __proto__ 为 null,无 hasOwnProperty、toString 等- 这种对象不会参与常规原型链查找,也不会受
Object.prototype上的污染影响 - 适合模块内部私有数据结构,不对外暴露,也不继承任何全局行为


















