__proto__ 是每个对象的内部原型链接,指向其原型对象;prototype 是函数独有的属性,用于指定其实例的原型,二者共同构成原型链。

JavaScript 中 __proto__ 和 prototype 是理解原型继承机制的两个核心概念,它们作用对象不同、存在位置不同,但共同构成了一条“原型链”。下面用清晰逻辑和图解式说明帮你理清关系。
prototype 是函数对象才有的属性,用于指定实例的原型
prototype 是**函数(Function)对象**独有的一个属性,它是一个普通对象,默认包含 constructor 指回该函数本身。当使用 new 调用该函数创建实例时,实例的 __proto__ 会自动指向这个 prototype 对象。
- 只有函数才有
prototype(如function Foo(){}、Array、Date等内置构造函数) -
Object.prototype、Array.prototype等是所有对应实例共享的方法来源(比如[].push就在Array.prototype上) - 普通对象(如
{}、let obj = {a:1})没有prototype属性(访问会得undefined)
__proto__ 是每个对象都有的内部属性,指向它的原型对象
__proto__(规范中称 [[Prototype]])是**每个对象**(包括函数)都具备的内部链接,它指向该对象的原型对象。浏览器中可通过 obj.__proto__ 访问(不推荐在生产环境使用,应优先用 Object.getPrototypeOf(obj))。
- 函数对象同时拥有
prototype(供他人继承)和__proto__(自己也需继承) - 实例对象只有
__proto__,没有prototype - 例如:
let arr = [],则arr.__proto__ === Array.prototype
关键关系:new 时自动建立 __proto__ → prototype 链接
当你写 const f = new Foo(),JS 引擎实际做了三件事:
立即学习“Java免费学习笔记(深入)”;
- 创建一个新对象
f - 将
f.__proto__指向Foo.prototype - 执行
Foo.call(f, ...args)初始化f
这就让 f 能通过原型链访问 Foo.prototype 上定义的所有属性和方法。
函数对象的双重身份:既是构造器,也是对象
函数(如 function Foo(){})比较特殊:
- 它有
prototype(因为它是函数,可被new) - 它也有
__proto__(因为函数本身是Function的实例)→ 所以Foo.__proto__ === Function.prototype - 而
Function.prototype本身是个普通函数对象,其__proto__指向Object.prototype - 最终,几乎所有对象的原型链都会到达
Object.prototype,其__proto__为null,表示链终止
简化的原型链示意:
f (实例)
└── __proto__ → Foo.prototype
└── __proto__ → Object.prototype
└── __proto__ → null
Foo (函数)
├── prototype → Foo.prototype
└── __proto__ → Function.prototype
└── __proto__ → Object.prototype
└── __proto__ → null










