__proto__ 是对象内部 [[prototype]] 的公开接口,指向其原型对象或 null;属性查找时沿 __proto__ 链逐级向上委托,直至 object.prototype.__proto__ === null 终止。

JavaScript 原型链的核心,是对象属性查找时的“向上委托”机制;而 __proto__ 就是这条链上每个节点实际指向其上级原型的隐式链接。
__proto__ 是什么?它不是魔法,而是内部 [[Prototype]] 的公开接口
每个普通对象(包括函数、数组、日期等)都内置一个隐藏链接,规范中叫 [[Prototype]]。浏览器和多数运行时提供 __proto__ 作为可读写的访问方式(非标准但广泛支持),等价于 Object.getPrototypeOf(obj)。
- 它不是对象自己的属性,而是引擎维护的内部引用
- 它的值总是另一个对象,或为 null(表示链终止)
- 函数也是对象,所以函数也有 __proto__,比如
function f(){}.__proto__ === Function.prototype
原型链怎么一步步查找属性?从实例出发,逐级向上跳
当你写 obj.method() 或 obj.prop,JS 引擎按固定顺序搜索:
- 先检查
obj自身是否有该属性(自有属性) - 没有?就看
obj.__proto__对象里有没有 - 还没有?再看
obj.__proto__.__proto__(即上一级原型) - 持续这个过程,直到找到属性,或抵达
Object.prototype.__proto__ === null
例如:const arr = [1,2]; arr.push(3) —— arr 自身没有 push,查到 arr.__proto__(即 Array.prototype),那里定义了 push,调用成功。
prototype 和 __proto__ 怎么连接起来?new 是关键桥梁
prototype 是函数才有的属性,它本身是个普通对象;__proto__ 是所有对象都有的链接。二者通过 new 操作绑定:
- 函数
F有F.prototype(默认含constructor: F) - 执行
new F()时,新对象的__proto__被自动设为F.prototype - 所以
instance.__proto__ === F.prototype恒成立
这正是继承能发生的基础:子类实例通过 __proto__ 连到父类 prototype,从而复用方法。
为什么 Object.prototype 是终点?null 不是错误,而是设计终点
所有对象最终都会连到 Object.prototype,因为:
-
Object.prototype是 JS 内置的最顶层原型对象 - 它的
__proto__明确被设为null(Object.prototype.__proto__ === null) - 查到
null就停止,返回undefined,避免无限循环
这也是为什么 {}.toString() 能工作:自身无 toString → 查 {}.__proto__(Object.prototype)→ 找到并执行。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











