__proto__负责原型链向上查找,constructor标识构造函数,二者协同实现对象溯源:__proto__指向原型,原型上的constructor回指构造函数,共同构成“实例→原型→构造函数”闭环。

JavaScript 中 __proto__ 和 constructor 并非独立存在,而是共同支撑原型链查找与对象溯源机制的两个关键角色:前者负责“向上找”,后者负责“回溯源”。
__proto__ 是对象的原型链接指针
每个普通对象(包括函数实例)都拥有 __proto__ 属性,它指向该对象的原型(即其构造函数的 prototype 对象)。这个链接构成了原型链的基础:
- 当访问对象上不存在的属性或方法时,JS 引擎会沿着
__proto__一级级向上查找,直到到达null(原型链终点) -
f1.__proto__ === Foo.prototype是典型等式,表明实例与构造函数原型的直接关联 -
__proto__是对象层级的内部连接,不可枚举,也不建议直接赋值(应使用Object.setPrototypeOf())
constructor 是原型上的“反向标记”
constructor 并不直接属于实例对象,而是存在于原型对象(如 Foo.prototype)上,它的作用是标明“谁造了我”:
-
Foo.prototype.constructor === Foo是默认行为,表示该原型是用来构造Foo实例的 - 实例对象(如
f1)本身没有constructor,但可通过原型链继承到Foo.prototype.constructor - 一旦重写整个
prototype(如Foo.prototype = { ... }),默认constructor就会丢失,需手动补回:constructor: Foo
二者协作完成“实例 → 构造函数”的闭环
通过 __proto__ 向上走到原型,再通过原型上的 constructor 回到构造函数,就形成了可追溯的对象创建路径:
-
f1.__proto__.constructor === Foo成立,说明实例能准确识别自己的构造器 - 这种关系对类型判断、动态实例化、框架反射(如 Vue/React 的组件构造)有实际意义
- 若
constructor被覆盖且未修复,f1.constructor可能指向Object,导致 instanceof 或 new f1.constructor() 行为异常
注意边界:函数也是对象,所以有双重身份
函数既可被调用,也可被 new,因此同时具备:
- 作为函数:拥有
__proto__(指向Function.prototype)和constructor(指向Function) - 作为构造器:拥有
prototype属性(供其实例的__proto__指向) - 所以
Foo.__proto__ === Function.prototype,而Foo.prototype.__proto__ === Object.prototype
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











