误删 object.prototype.__proto__ 不会导致应用瘫痪,因其为不可删除的非配置属性;实际多为强行改写为可配置后删除,或误删 constructor/tostring 等核心方法,破坏原型链与基础语义。

误删 Object.prototype.__proto__ 不会导致“整个应用瘫痪”,因为该属性本身在标准中是不可删除的非配置属性。你实际遇到的,极大概率是以下两种更常见、也更危险的情况之一:
情况一:你执行了 Object.defineProperty(Object.prototype, '__proto__', { value: undefined, configurable: true }) 并随后 delete Object.prototype.__proto__
这是唯一能“删掉”它的路径——先强行改写为可配置,再删除。但后果不是“没了 __proto__”,而是:破坏了原型链查找机制的基础语义。所有对象(包括 {}、[]、new Date() 等)在访问未定义属性时,本应沿 __proto__ 向上查找,现在这一链路被物理切断,导致:
-
{}.toString()报错TypeError: toString is not a function -
Array.isArray([])返回false - Lodash、Axios、React 等几乎所有依赖原型方法的库立即失效
情况二:你误删的是 Object.prototype.constructor 或覆盖了 toString/hasOwnProperty 等核心方法
这类操作更隐蔽、更常见,且破坏力等同甚至更强。例如:
-
delete Object.prototype.constructor→ 所有对象obj.constructor为undefined,instanceof全面失灵 -
Object.prototype.toString = null→JSON.stringify({})直接抛错,控制台日志、序列化、调试全部中断 -
Object.prototype.hasOwnProperty = () => false→ 所有对象的属性存在性判断永远返回 false,逻辑大面积崩溃
紧急恢复三步法(必须在页面刷新前执行)
若当前页面尚未完全白屏或控制台仍可输入,请立即在 DevTools Console 中逐行执行:
-
重置 __proto__(仅适用于情况一):
Object.defineProperty(Object.prototype, '__proto__', { get() { return Object.getPrototypeOf(this); }, set(v) { Object.setPrototypeOf(this, v); }, enumerable: false, configurable: true }); -
恢复 constructor:
Object.defineProperty(Object.prototype, 'constructor', { value: Object, writable: true, enumerable: false, configurable: true }); -
恢复 toString 和 hasOwnProperty:
Object.prototype.toString = Object.prototype.toString; Object.prototype.hasOwnProperty = Object.prototype.hasOwnProperty;(注意:这里不是赋值字符串,而是重新引用原生函数)
彻底杜绝复发的硬性措施
光恢复不够,必须阻断再次发生的机会:
- 启动阶段第一行加:
Object.freeze(Object.prototype);—— 冻结后,任何delete、=、defineProperty都会静默失败(非严格模式)或抛TypeError(严格模式) - 禁止所有开发环境使用
eval、new Function()、内联javascript:;CI 流水线加入 AST 扫描,拦截含delete Object.prototype或__proto__赋值的代码 - 用
Object.create(null)替代所有配置对象、映射表、缓存容器 —— 它天生不继承__proto__和constructor,从源头免疫











