prototype是函数独有的属性,用于定义实例的__proto__指向;__proto__是所有对象的内部原型链链接,负责属性查找时的向上追溯。

prototype 是函数才有的属性,__proto__ 是每个对象(包括函数)都有的内部链接。它们不是同一个东西,也不直接相等,但在原型继承中紧密配合——一个负责“铺路”,一个负责“走这条路”。
prototype:只属于函数,定义“后代该往哪找”
它是一个普通对象,由构造函数自带,用来规定:将来用 new 创建的实例,其 __proto__ 应该指向谁。
- 只有函数(如
function Foo(){}、Array、Date)有prototype属性;普通对象(如{}或let obj = {x:1})没有,访问会得undefined -
Foo.prototype默认带一个constructor属性,指回Foo函数本身 - 所有共享方法(比如
Array.prototype.push)都挂在这个对象上,供实例复用
__proto__:每个对象都有,是“实际走的继承链”
它是对象内部的 [[Prototype]] 链接(浏览器里暴露为 __proto__),决定了属性查找时向上追溯的路径。
- 实例对象(如
let a = new Foo())只有__proto__,没有prototype - 函数对象比较特殊:它既有
__proto__(自己作为对象也要继承),也有prototype(作为构造函数要给别人继承) - 通过
Object.create(obj)创建的对象,其__proto__直接指向obj,不经过构造函数
它们怎么一起实现继承?
当访问 a.xxx 时:
- 先查
a自身有没有xxx - 没有就查
a.__proto__(即Foo.prototype) - 还没找到,就继续查
a.__proto__.__proto__(即Foo.prototype.__proto__,通常是Object.prototype) - 最终到
Object.prototype.__proto__ === null停止,找不到就返回undefined
这条层层向上的查找路径,就是原型链——prototype 提供了链上的节点,__proto__ 把节点串起来。
几个关键对应关系
-
let arr = []→arr.__proto__ === Array.prototype -
Array.__proto__ === Function.prototype(因为Array是函数,且由Function构造) Function.prototype.__proto__ === Object.prototype-
Object.prototype.__proto__ === null(原型链终点)











