JavaScript原型链是属性访问时引擎按自有属性→__proto__→上层__proto__逐级查找的确定机制,终点为Object.prototype,其链接在对象创建时建立且可动态修改。

要真正理解 JavaScript 原型链的底层运行原理,关键不是记住 __proto__ 和 prototype 的区别,而是看清“属性访问时引擎到底做了什么”。它是一套确定、可预测的查找机制,不是魔法。
原型链的本质是属性查找路径
当你写 obj.method() 或 obj.name 时,JavaScript 引擎按固定顺序搜索:
- 先检查
obj自身是否拥有该属性(自有属性) - 如果没有,就去
obj.__proto__指向的对象上找 - 如果还没找到,继续去
obj.__proto__.__proto__上找 - 一直向上,直到到达
Object.prototype -
Object.prototype.__proto__是null,查找终止,返回undefined
构造函数、实例与原型三者的绑定关系
这种查找能成立,依赖于创建对象时自动建立的隐式链接:
- 用
new Fn()创建实例时,引擎会把该实例的[[Prototype]](即__proto__)设为Fn.prototype -
Fn.prototype默认有一个constructor属性,指回Fn,形成闭环 - 所有函数(非箭头函数)都有
prototype属性;所有对象(除null)都有__proto__
所有对象最终都连到 Object.prototype
无论你用 {}、[]、function(){} 还是 new Date() 创建对象,它们的原型链终点都是同一个:
立即学习“Java免费学习笔记(深入)”;
-
{}→Object.prototype→null -
[]→Array.prototype→Object.prototype→null -
function f(){}→Function.prototype→Object.prototype→null
这个统一终点让 toString()、hasOwnProperty() 等方法能在任意对象上调用。
原型链不是静态快照,而是动态实时链路
原型对象可以随时被修改,所有继承它的实例会立即反映变化:
- 在
Person.prototype上新增方法,已有person1、person2实例立刻可用 - 直接改写
Person.prototype = {...}会切断已有实例的连接(因为__proto__指向旧对象) - 但通过
Object.setPrototypeOf(obj, newProto)可以动态重设单个对象的原型


















