JavaScript 中原型链对 JavaScript 引擎内存布局的影响

原型链是JavaScript引擎在内存中真实维护的单向指针链,约束对象、原型与构造函数间的引用关系,决定属性存储位置、方法复用方式及查找路径开销。

javascript 中原型链对 javascript 引擎内存布局的影响

原型链本身不直接决定 JavaScript 引擎的底层内存布局(比如 V8 的对象结构体如何排布),但它深刻约束了内存中对象、原型、构造函数三者之间的引用关系与数据分布策略。这种约束直接影响属性存储位置、方法复用方式、查找路径开销,进而塑造了引擎对内存的实际组织逻辑。

实例属性与原型属性分存于不同内存区域

每个对象在堆内存中拥有独立的“属性字典”(Property Dictionary),只存放自有属性(own properties)——即直接赋值给该对象的键值对。而方法或共享属性通常挂在构造函数的 prototype 对象上,这个原型对象本身也是堆中一个普通对象,被所有实例共享引用,而非复制。

  • 例如:function Person(name) { this.name = name; } 中,name 存在每个实例自己的属性字典里;
  • Person.prototype.sayHi = function() { console.log('hi'); }; 这个函数只在 Person.prototype 对象中存一份,所有 new Person() 实例通过 __proto__ 指针间接访问它。

[[Prototype]] 是隐式指针,不是数据拷贝

引擎不会为每个对象复制原型上的内容,而是设置一个内部槽 [[Prototype]](对应可访问的 __proto__),本质是一个内存地址指针。这个指针让多个对象能指向同一块原型内存区域。

  • 字面量 {a: 1}__proto__ 指向 Object.prototype
  • new Date()__proto__ 指向 Date.prototype,而后者又指向 Object.prototype
  • 所有这些指针最终汇聚到同一个 Object.prototype 对象,再由它指向 null 终止链路。

属性查找路径决定运行时内存访问模式

引擎执行 obj.x 时,并非一次性加载整个原型链,而是按需逐级跳转指针:

立即学习“Java免费学习笔记(深入)”;

  • 先查 obj 自身属性字典;
  • 未命中 → 读取 obj.[[Prototype]] 地址 → 访问那个对象的属性字典;
  • 仍不命中 → 继续读取上一级 [[Prototype]],直到 null

这意味着:原型链越长,属性访问的缓存友好性越低,V8 等引擎会为此做内联缓存(IC)优化,但深层链仍带来实际内存寻址开销。

函数对象的双重角色强化原型链闭环

函数既是可调用对象,又是构造器。它的 prototype 属性是供实例继承的原型对象;而它自身作为对象,其 [[Prototype]] 又指向 Function.prototype —— 这个特殊对象的 [[Prototype]] 又连回 Object.prototype

  • Function.__proto__ === Function.prototype 是唯一打破常规的闭环点;
  • 这使得所有函数(包括 ObjectArray、自定义构造函数)都统一纳入同一套原型委托体系,引擎得以用一套机制处理所有对象的继承与查找。

不复杂但容易忽略:原型链不是语法糖,它是引擎在内存中真实维护的一组单向指针链。它让 JS 用极少的内存代价支撑起动态继承,也要求开发者理解——写在 prototype 上的方法,改一处就影响所有实例;而写在构造函数里的方法,每个实例都独占一份内存。

文章来自机圈观察员网,发布者:,转载请注明出处:https://www.jqgcy.com/xitongjiaocheng/126722.html

SQL如何实现基于地理位置的分组统计?
上一篇 2026-07-19 14:13
SQL Server中如何使用OVER子句代替传统的GROUP BY?
下一篇 2026-07-19 14:13

相关推荐