原型链查找不影响原型对象垃圾回收,其是否被回收仅取决于自身是否可达;实例回收与原型无关,二者生命周期独立;常见操作如in、hasownproperty、方法调用等均不干扰gc判定。

原型链查找过程本身不会阻止原型对象被垃圾回收,只要它不可达,就会被回收——哪怕正在被某个实例沿链查找。
原型对象的可达性决定是否被回收
原型对象(比如 Person.prototype)本质是普通对象,它的生命周期只取决于是否还有“可达路径”:即能否从全局根(如 window、模块顶层变量、活跃闭包等)出发,通过引用链访问到它。
- 如果构造函数被设为
null,且没有其他变量或闭包持有对它的引用,它的prototype就会失去可达性 - 动态导入的模块中,若显式将模块引用设为
null,其导出的构造函数及对应prototype也可能被回收 - 浏览器全局作用域中定义的构造函数(如
function Person(){})通常长期存活,因为它们挂在window或模块顶层,构成 GC 根
查找过程不延长原型的存活时间
当你写 obj.name,引擎沿 __proto__ 向上查找时,并不会让原型对象“临时变可达”。查找只是读取操作,不建立新引用。
- 即使
obj正在查找obj.__proto__.method,只要obj.__proto本身已不可达,它仍会被标记清除算法回收 - 查找失败(返回
undefined)或成功,都不影响原型对象的 GC 状态 - 原型链末端的
Object.prototype通常不会被回收,因为它被大量内置对象隐式引用,属于强根集的一部分
实例回收与原型无关
一个实例对象能否被回收,完全取决于它自身是否可达,跟它的 __proto__ 指向谁没关系。
- 哪怕原型对象很大、方法很多,只要实例不再被任何变量或闭包引用,它就会被立即回收
- 原型对象是否回收,是独立判断的:它自己的引用关系决定,不依赖于任何实例的存在
- 也就是说,实例被回收后,原型对象可能还活着;原型被回收了,也不代表实例一定不可达
不影响 GC 的常见操作
以下行为不会干扰原型对象的垃圾回收判定:
- 用
in操作符检查属性(它会查整个原型链,但不产生引用) - 调用
hasOwnProperty(只查自身,更无影响) - 读取或调用原型上的方法(执行时不保留对原型的持久引用)
- 修改实例自身属性(如
obj.x = 1),不会牵连原型
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











