原型链本身不会导致死循环,但若误改__proto__形成闭环(如指向自身),则会引发无限递归和栈溢出;应检查原型链终点是否为null,禁用__proto__并用object.create(null)隔离风险。

原型链本身不会直接导致运行时死循环,但若在遍历原型链或实现自定义继承逻辑时误判了链的终点(比如把 __proto__ 指向自己、或手动构造了闭环),就可能触发无限递归,表现为栈溢出(RangeError: Maximum call stack size exceeded)。
看原型链是否意外成环
正常原型链以 Object.prototype 为终点,其 __proto__ 是 null。只要中间某环节被改写为指向自身或上游对象,就会形成闭环:
- 检查关键对象的
__proto__链:用浏览器控制台逐级打印obj.__proto__→obj.__proto__.__proto__… 直到出现null或重复对象 - 用代码快速检测闭环:
function checkProtoCycle(obj) {
const visited = new WeakSet();
let current = obj;
while (current && !visited.has(current)) {
visited.add(current);
current = current.__proto__;
}
return current !== null;
}
排查高危操作场景
以下修改极易破坏原型链结构,需重点审查:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 直接赋值
obj.__proto__ = obj或Constructor.prototype.__proto__ = Constructor.prototype - 用
Object.setPrototypeOf()把某个对象设为其自身的原型 - 在类继承中错误重写
static get prototype()或篡改constructor.prototype指向 - 第三方库(尤其老旧 polyfill)偷偷劫持
Object.prototype或Function.prototype
定位死循环发生点
当调用 hasOwnProperty、toString、isPrototypeOf 等依赖原型链的方法卡住时:
- 打开 Chrome DevTools → Sources 面板 → 启用 “Pause on caught exceptions” 和 “Blackbox content scripts”
- 复现问题,查看调用栈顶部是否反复出现
__proto__、getPrototypeOf或自定义的findInPrototypeChain类方法 - 在疑似位置加断点,观察
this.__proto__是否开始重复出现同一对象
修复原则是切断强引用闭环
原型链闭环必须显式打破,WeakMap 等弱引用机制在这里不适用:
- 恢复被篡改的
__proto__:例如obj.__proto__ = Object.prototype - 避免在原型上存储对实例或构造函数的反向强引用(如
MyClass.prototype.instanceRef = this) - 用
Object.create(null)创建无原型的对象,彻底隔离风险(适合 Map/Store 类结构) - 禁用危险 API:在 ESLint 中启用
no-proto规则,禁止使用__proto__










