冻结原生类型prototype可从底层阻断原型污染,因object.freeze使原型自有属性writable和configurable为false,禁止增删改及setprototypeof操作;需优先冻结object、array、function、string、number等原型,并在入口文件顶部尽早执行。

直接冻结原生类型的 prototype 是防止原型污染最有效的手段之一。它不依赖代码规范或运行时检查,而是从底层切断修改路径——一旦冻结,任何对原型的增、删、改操作都会失效(严格模式报错,非严格模式静默失败)。
为什么冻结原型能防篡改
JavaScript 中,所有实例共享其构造函数的 prototype。如果这个原型对象被意外添加或覆盖方法(比如 Array.prototype.push = () => {}),会影响全局所有数组行为。而 Object.freeze() 会将原型对象的所有自有属性设为:
• writable: false(值不可改)
• configurable: false(不能删、不能重定义)
• enumerable: 保持原状(不影响遍历)
同时,它还会阻止对该对象调用 Object.setPrototypeOf() 或重新赋值 __proto__。
哪些原型建议冻结
优先冻结高频使用、易被第三方库误改的原生构造器原型:
• Object.prototype(最危险,但冻结需格外谨慎)
• Array.prototype
• Function.prototype
• String.prototype
• Number.prototype
注意:Object.prototype 冻结后可能影响部分依赖其动态特性的老代码,生产环境建议先做兼容性验证。
正确冻结的写法和时机
必须在应用逻辑执行前尽早调用,避免中间有代码已修改原型:
• 放在入口文件顶部(如 index.js 或 main.ts 最开始)
• 不要放在模块内部或条件分支里
示例:
Object.freeze(Array.prototype);<br>Object.freeze(String.prototype);<br>Object.freeze(Number.prototype);<br>Object.freeze(Function.prototype);
冻结后可用 Object.isFrozen(Array.prototype) 验证是否生效。
冻结的局限与注意事项
• 它只冻结目标对象本身,不递归冻结其属性值(但原型对象通常不含深层嵌套对象,这点影响小)
• 冻结后,Chrome DevTools 中属性名会显示为灰色带锁图标,属正常现象
• V8 引擎会对冻结对象启用特定优化路径,一般无性能负担,但调试时 console.log 可能不展开细节
• 若项目使用了某些依赖原型动态扩展的库(如极少数 polyfill),需测试兼容性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











