JavaScript原型链查找不会死循环,前提是链以null终结;若人为构造闭环(如a.__proto__=b且b.__proto__=a)则无限跳转;合法链必止于Object.prototype,其[[Prototype]]为null。

JavaScript 中原型链查找属性本身不会导致死循环,前提是原型链结构合法——即没有人为构造出循环引用。死循环只发生在原型链被恶意或错误地改造成闭环时,比如 a.__proto__ = b 且 b.__proto__ = a。引擎在正常查找过程中并不检测环,而是依赖开发者维护链的终结(以 null 收尾)。只要链最终指向 null,查找就会自然停止。
确保原型链终点是 null
所有合法原型链必须终止于 Object.prototype,而它的 [[Prototype]] 是 null。这是规范强制要求的终点:
-
{}的__proto__指向Object.prototype -
Object.prototype.__proto__ === null→ 查找在此停止 - 手动创建对象时,优先用
Object.create(proto),它会自动设好null终点(若传null)或正确链接
避免手动篡改 __proto__ 形成闭环
__proto__ 是可写属性,但随意赋值极易引入环。例如:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- ❌ 错误:
let a = {}; let b = {}; a.__proto__ = b; b.__proto__ = a;→ 查找a.x会无限跳转 - ✅ 正确:只单向设置,且确保某一级最终落到
Object.prototype或null - 更安全的做法是禁用
__proto__,改用Object.setPrototypeOf(obj, proto),它在现代环境有更好错误提示
使用标准 API 辅助检测与防护
开发中可通过工具提前发现潜在环:
立即学习“Java免费学习笔记(深入)”;
- 获取完整原型链时,用
Object.getPrototypeOf()循环调用,并用Set缓存已访问对象,一旦重复就报错 - 检查是否在链上:封装
hasInPrototypeChain(obj, key),内部记录已查对象,遇到重复立即退出 - 冻结关键原型对象(如
Object.prototype),防止被意外修改:Object.freeze(Object.prototype)
构造函数与 class 能天然防环
使用 function 构造器或 class 创建实例时,引擎自动建立符合规范的原型链:
-
new Foo()→ 实例的__proto__指向Foo.prototype -
Foo.prototype.__proto__默认指向Object.prototype - 除非显式重写
Foo.prototype.__proto__,否则不会出环

















