__proto__ 是实例对象通往其构造函数原型的单向引用,构成原型链的关键一环;它指向原型对象,反映“谁创建了谁”,而非构造函数间的继承关系。

JavaScript 中 __proto__ 不是构造函数链,而是**实例对象通往其构造函数原型的单向引用**。它不构成“链”本身,而是构成原型链(prototype chain)的关键一环。
__proto__ 的本质:实例到 prototype 的桥梁
每个对象(包括函数)在创建时,内部都会被赋予一个 [[Prototype]] 内部属性,浏览器通常用可访问的 __proto__ 暴露它(非标准但广泛支持)。它的值,就是该对象“由哪个构造函数创建”的直接线索:
-
new A()创建的实例a,其a.__proto__ === A.prototype -
Object.create(obj)创建的对象,其__proto__直接指向obj,与构造函数无关 - 函数也是对象,所以
function F() {}本身也有F.__proto__ === Function.prototype
构造函数链?实际并不存在
JavaScript 中没有所谓“构造函数链”。你看到的链条(如 F → Function → Object → null)其实是函数对象自身的原型链,而非构造函数之间的继承关系:
-
F.constructor === Function,说明F是Function的实例 -
F.__proto__ === Function.prototype,而Function.prototype.__proto__ === Object.prototype -
Object.prototype.__proto__ === null,链在此终止
这个链条反映的是“谁创建了谁”,不是“谁继承了谁”。构造函数之间若要建立继承(如子类继承父类),必须显式设置 Child.prototype = Object.create(Parent.prototype),否则无关联。
__proto__ 与 constructor 的配合关系
__proto__ 指向原型对象,而原型对象上通常有 constructor 属性,用于反向标识其“归属构造函数”:
-
A.prototype.constructor === A(默认行为) - 若手动重写
A.prototype = {...},会丢失constructor,需手动恢复:A.prototype.constructor = A - 但注意:
instance.constructor是从instance.__proto__开始沿原型链查找的,不是实例自有属性
instanceof 背后依赖的就是 __proto__ 链
obj instanceof Ctor 的判断逻辑,正是沿着 obj.__proto__ 一路向上比对,看是否等于 Ctor.prototype 或其某个祖先原型:
-
const a = new A(); a instanceof A → true(因为a.__proto__ === A.prototype) -
a instanceof Object → true(因为A.prototype.__proto__ === Object.prototype) -
Function instanceof Object → true(因Function.__proto__最终能到达Object.prototype)
这个过程完全依赖 __proto__ 构成的委托路径,而非构造函数自身形成某种“链式调用”结构。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











