实例的__proto__指向构造函数的prototype,由new自动绑定;所有同构造函数实例共享同一prototype;__proto__存在于所有对象,prototype仅存在于函数;原型链终点为object.prototype,其__proto__为null。

实例对象的 __proto__ 指向其构造函数的 prototype 对象,这是 JavaScript 引擎在执行 new 时自动完成的绑定,不是手动赋值,也不依赖代码显式写出来。
new 操作触发的隐式链接
当你写 const p = new Person(),引擎内部会做三件事:
- 创建一个空对象(即实例
p) - 将这个空对象的
__proto__属性设为Person.prototype - 用
p作为this执行Person函数体
第二步就是关键:它让 p.__proto__ === Person.prototype 成立。你不需要、也不应该手动写 p.__proto__ = Person.prototype —— 这是语言机制,不是编程习惯。
所有实例都共享同一份 prototype
__proto__ 不是每个实例独有的一份副本,而是所有通过同一个构造函数创建的实例,都指向同一个 prototype 对象:
-
const a = new Person()和const b = new Person() - 那么
a.__proto__ === b.__proto__为 true - 它们共用
Person.prototype上定义的方法和属性
这也是原型复用的核心:方法只存一份,多个实例共享,节省内存。
普通对象和函数对象的差异要分清
__proto__ 存在于所有对象上(包括数组、日期、自定义对象),但 prototype 只存在于函数(且是“可构造”的函数)上:
-
const obj = {}→obj.__proto__存在,指向Object.prototype;obj.prototype是undefined -
function Foo(){}→Foo.__proto__存在(因为函数也是对象),同时Foo.prototype也存在 -
const f = new Foo()→f.__proto__ === Foo.prototype
终点是 Object.prototype,再往上就断了
原型链最终都会落到 Object.prototype,它的 __proto__ 是 null:
-
{}.constructor === Object→ 所以{}.__proto__ === Object.prototype -
Object.prototype.__proto__ === null→ 链条终止 - 查属性时,一旦走到
null还没找到,就返回undefined











