误删 object.prototype 关键属性会导致所有对象基础行为失效,原型链“瘫痪”;应立即冻结 object.prototype、检查缺失属性、恢复核心方法,或代理缺失行为,并通过 eslint 等手段阻断复发。

误删 Object.prototype 上的关键属性(如 toString、hasOwnProperty、constructor 等)会导致所有对象失去基础行为,整个原型链“瘫痪”:方法调用报错、instanceof 失效、JSON.stringify 崩溃、甚至控制台 console.log 都可能异常。这不是链“断开”,而是链的起点被挖空——所有对象都依赖它作为终点。
立即冻结并确认污染范围
一旦怀疑 Object.prototype 被修改,首要动作不是修复,而是止血:
- 执行
Object.isFrozen(Object.prototype),若返回false,说明仍可写入,立刻冻结:Object.freeze(Object.prototype) - 检查哪些属性丢失或被覆盖:
console.log(Object.getOwnPropertyNames(Object.prototype)),对比标准列表(如toString、valueOf、hasOwnProperty、isPrototypeOf等) - 验证是否已影响基础行为:
({}).toString()是否报错?Object.prototype.hasOwnProperty.call({}, 'a')是否可用?
恢复核心方法(仅限未冻结前)
如果尚未冻结且属性被 delete 或赋值为 undefined,可逐个还原(注意:必须在冻结前操作):
- 还原
toString:Object.prototype.toString = function() { return '[object ' + (this.constructor?.name || 'Object') + ']'; }; - 还原
hasOwnProperty:Object.prototype.hasOwnProperty = Object.prototype.hasOwnProperty;(直接从原始引用恢复) - 还原
valueOf和isPrototypeOf同理,优先从Object.prototype原始快照或浏览器默认实现复原 - 避免用字面量重写整个
Object.prototype——这会破坏所有继承关系,不可逆
兜底兼容:代理缺失行为
若已冻结且关键方法永久丢失(如生产环境无法重启),需在应用层拦截并模拟基础能力:
- 封装安全的
toString替代:function safeToString(obj) { return obj?.toString?.() ?? '[object Object]'; } - 替代
hasOwnProperty:function hasOwn(obj, key) { return Object.prototype.hasOwnProperty.call(obj, key); }(只要Object.prototype.hasOwnProperty还在) - 对
JSON.stringify报错场景,加 try/catch 并提供降级序列化逻辑
定位源头并阻断复发
这类故障几乎总是由第三方库、恶意脚本或错误的 polyfill 引起:
- 搜索项目中所有
delete Object.prototype.xxx或Object.prototype.xxx = ...的代码,彻底移除 - 检查构建产物(尤其旧版 Babel 输出),确认没有
Object.prototype = null类操作 - 在微前端子应用加载前,临时劫持
Object.defineProperty和Object.prototype的 setter,记录并阻止非法写入 - 启用 ESLint 规则
no-extend-native,禁止扩展内置原型
不复杂但容易忽略——绝大多数 Object.prototype 瘫痪问题,只需在启动时加一行 Object.freeze(Object.prototype) 就能杜绝。真正危险的不是删除动作本身,而是它发生后无人察觉,直到整个应用开始静默失效。










