控制台中__proto__是动态getter而非静态属性,每次展开都会切换上下文并重新渲染,造成原型链冗长假象;真实原型链仅三层:实例→构造函数原型→object.prototype→null。

控制台里看到的 __proto__ 并不是“直接显示原型链”,而是每次展开时动态切换上下文后重新渲染的结果,所以看起来层级变深、重复出现,容易误以为原型链很长。
__proto__ 是 getter,不是静态属性
它本质是个访问器(accessor):
- 调用
obj.__proto__实际执行的是Object.getPrototypeOf(obj) - 返回的是当前对象的
[[Prototype]],也就是它的“父级原型” - 这个 getter 定义在
Object.prototype上,所以所有对象都能用
控制台展开时 this 会逐层改变
你点开一个对象的 __proto__,控制台就把当前展示目标换成那个原型对象——后续再点它的 __proto__,就相当于对新对象调用 getter:
-
str.__proto__→ 返回String.prototype - 再点这个结果的
__proto__→ 相当于String.prototype.__proto__→ 返回Object.prototype - 再点 →
Object.prototype.__proto__→ 返回null
表面上要点 5 次才到 null,其实是控制台把每层都当作独立对象重新渲染,加上自身显示的 [[Prototype]] 字段,造成视觉冗余。
真正原型链只有三层(以 new String('123') 为例)
实际继承路径很短:
-
str的[[Prototype]]是String.prototype -
String.prototype的[[Prototype]]是Object.prototype -
Object.prototype的[[Prototype]]是null
控制台显示的多层 [[Prototype]] 和反复出现的 __proto__ 是渲染机制导致的,不是真实链长。
别依赖 __proto__ 做逻辑判断
它是非标准、已废弃的特性:
- 推荐用
Object.getPrototypeOf(obj)获取原型 - 用
Object.setPrototypeOf(obj, proto)设置(仅开发调试,避免生产使用) - 检查是否在原型链上,优先用
obj instanceof Constructor或Constructor.prototype.isPrototypeOf(obj)











