object.getprototypeof()是获取对象原型的标准只读方法,替代非标准可写的__proto__;用于类型判断、原型链遍历、结构校验及真实溯源,设置原型应使用object.setprototypeof()。

JavaScript 中的 __proto__ 不是静态属性,而是一个动态 getter —— 它的返回值取决于**当前对象的内部 [[Prototype]]**,而不是调用时的上下文环境本身。所谓“不同上下文对象”,其实是指控制台展开过程中不断切换的显示目标,而非 JavaScript 执行时的 this 绑定或作用域变化。
__proto__ 的本质是 Object.getPrototypeOf() 的语法糖
每次访问 obj.__proto__,等价于执行 Object.getPrototypeOf(obj),返回的是该对象内部的 [[Prototype]] 内部槽(internal slot)所指向的对象。
- 这个操作不依赖函数调用上下文(比如 call/apply/bind),也不受 this 指向影响
- 它只读取对象自身的原型引用,与所在作用域、闭包、执行栈无关
- 即使 obj 是在箭头函数、严格模式或模块顶层定义的,
__proto__行为完全一致
控制台中“多层展开”不是上下文切换,而是目标重置
你在浏览器控制台点开一个对象的 __proto__,再点开它的 __proto__……看起来像在“不同上下文”中操作,实际是:
- 第一次点击:展示
obj的原型 → 控制台把渲染焦点切到String.prototype - 第二次点击:此时你操作的是
String.prototype这个新对象 → 调用的是String.prototype.__proto__,即Object.getPrototypeOf(String.prototype) - 第三次点击:焦点变为
Object.prototype→ 调用其__proto__,结果为null
这不是 JavaScript 引擎改变了什么上下文,而是开发者工具在逐级把“当前查看对象”替换成上一级原型,每次都是对**新对象**做独立的 getPrototypeOf 调用。
不同构造方式的对象,__proto__ 指向规律明确
无论对象如何创建,__proto__ 始终准确反映其原型链起点:
-
const arr = []→arr.__proto__ === Array.prototype -
const str = "a"→str.__proto__ === String.prototype -
const obj = {}→obj.__proto__ === Object.prototype -
const nullobj = Object.create(null)→nullobj.__proto__是 undefined(因为没有原型) -
class C {}实例 →new C().__proto__ === C.prototype
不要用 __proto__ 判断运行时逻辑
它已被标准标记为废弃(deprecated),且行为在部分环境(如某些 strict 模式或旧引擎)中受限:
- 应改用
Object.getPrototypeOf(obj)获取原型 - 判断继承关系请用
obj instanceof Constructor或Constructor.prototype.isPrototypeOf(obj) - 设置原型必须用
Object.setPrototypeOf(obj, proto),而非赋值__proto__ - ES6+ 类语法下,
__proto__更不可靠,尤其涉及派生类或内置子类时
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











