javascript原型链是对象间通过[[prototype]]链接形成的属性查找路径,从实例自底向上回溯至object.prototype直至null,由new操作和prototype共同构建,支持动态修改。

JavaScript 原型链的本质,是对象间通过隐式原型链接形成的、用于属性和方法查找的线性回溯路径。它不是语法结构,而是运行时引擎执行属性访问时自动触发的一套查找机制。
每个对象都有一个 [[Prototype]] 链接
所有 JavaScript 对象(除 null 外)内部都存在一个不可直接访问的属性 [[Prototype]],浏览器中可通过 __proto__ 读取其值。这个链接指向该对象的“原型对象”,构成链式起点。
- 普通对象(如
{}或new Object())的 [[Prototype]] 指向 Object.prototype - 数组(如
[])的 [[Prototype]] 指向 Array.prototype - 函数(如
function f(){})的 [[Prototype]] 指向 Function.prototype - Object.prototype.__proto__ 的值为 null,这是整个原型链的终点
构造函数与 prototype 是链的“制造者”
当你用 new Fn() 创建实例时,引擎会把该实例的 [[Prototype]] 设置为 Fn.prototype。也就是说,prototype 是给实例用的模板,而 __proto__ 是实例指向这个模板的指针。
- 函数对象自身有 prototype 属性(普通对象没有)
- 所有由该函数创建的实例,共享同一个 __proto__ === Fn.prototype
- Fn.prototype 本身是普通对象,所以它的 [[Prototype]] 指向 Object.prototype
属性查找:一次自底向上的线性遍历
执行 obj.x 时,引擎不会跳转或分支,而是严格按顺序检查:
- 先查
obj自身是否有自有属性x - 没有就查
obj.__proto__上有没有 - 还没有就查
obj.__proto__.__proto__(即Object.prototype) - 直到某一级找到,或最终抵达
null,返回 undefined
例如 [].push 能调用,是因为:[] → Array.prototype → Object.prototype → null,而 push 定义在 Array.prototype 上,查找在第二层就命中。
原型链不是静态图,而是动态可变的运行时结构
你可以随时修改对象的 __proto__(不推荐),或给原型对象添加/删除属性,所有继承它的实例会立即感知变化——这正是原型链“动态继承”的体现。
- 修改
Person.prototype.say = function(){},已有person1、person2立刻能调用say - 重写
obj.__proto__ = {},会切断原有链路,后续查找从新原型开始 - 但直接赋值
obj.x = 1只影响自身,不改变原型
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











