JavaScript 底层逻辑:从内存视角看原型与原型链

在 JavaScript 中,对象属性的访问并非简单的键值对匹配。其背后隐藏着一套基于 [[Prototype]] 的委托机制。本文将跳过感性的类比,直接从 V8 引擎的属性查找原理内存引用 出发,剖析原型系统的本质。

一、 显示原型(Explicit Prototype)

1. 属性定义与物理存储

当定义一个函数 function Foo() {} 时,V8 会在堆内存中自动创建一个对象,并让该函数的 prototype 属性指向该对象。

  • 物理属性:prototype 是函数独有的属性。
  • 用途 :它定义了由该构造函数创建的所有实例共享的属性和方法
javascript 复制代码
function Foo(name) {
    this.name = name; // 写入实例自身的存储空间
}

// 写入 Foo.prototype 存储空间,实现内存复用
Foo.prototype.walk = function() {
    console.log(this.name + ' is walking');
};

2. 写入与读取权限

  • 读取:实例可以读取 prototype 上的属性。
  • 写入隔离 :通过实例进行赋值操作(如 instance.prop = value)时,V8 只会在实例自身添加一个属性,而不会跨过原型去修改构造函数的 prototype。这种机制确保了原型属性的稳定性。

二、 隐式原型(Implicit Prototype)与 V8 查找机制

1. [[Prototype]] 内部槽

每个对象(除 null 外)在创建时都会关联另一个对象,这个对象就是它的原型。在规范中被称为 [[Prototype]],在浏览器实现中通常表现为 proto

2. V8 属性查找算法

当访问 obj.prop 时,V8 的执行流程如下:

  1. Own Properties Check:检查当前对象内部的 properties 表(或常量池)中是否存在该键。
  2. Prototype Traversal :若未命中,V8 会获取 obj.proto 指向的地址,跳转到该对象进行查找。
  3. Recursion:重复步骤 2,直到找到匹配的键或到达链条终点 null。

3. 核心等式

当执行 const f = new Foo() 时,JavaScript 引擎会完成如下内存操作:

javascript 复制代码
// 核心逻辑简述
f.__proto__ === Foo.prototype; // 指向同一内存地址

三、 原型链的完整链路推演

原型链的本质是对象引用组成的单向链表

1. 实例链路分析

以 const f1 = new Foo() 为例,其内存搜索链路(Look-up Chain)如下:

  1. f1 的自有属性。
  2. f1.proto (对应 Foo.prototype)。
  3. f1.proto .proto (对应 Object.prototype)。
  4. f1.proto .proto .proto (结果为 null)。

2. 特殊实体:Function 与 Object

在 JavaScript 的底层实现中,函数也是对象。这意味着函数不仅有 prototype(用于它的实例),也有 proto(因为它自己也是别人的实例)。

javascript 复制代码
// 函数作为对象,由 Function 构造
Foo.__proto__ === Function.prototype;

// Function 构造函数本身也是对象
// 这是一个自引用的特殊设计:Function 是由 Function 产生的
console.log(Function.__proto__ === Function.prototype); // true

// 最终所有原型对象(除了 Object.prototype)都源自 Object
console.log(Function.prototype.__proto__ === Object.prototype); // true

四、 总结:理解原型链的三个维度

  1. 构造维度:prototype 决定了子类"能继承什么"。
  2. 查找维度proto 决定了对象"向上查找的路径"。
  3. 连接维度 :constructor 建立了原型对象与构造函数的回溯关系。 底层意义 :原型链通过内存引用 而非内存拷贝实现了属性共享。这种"委托查找"模式是 JavaScript 实现高效面向对象编程的基础。

作者:周同学 笔记摘要:本文整理自个人关于 JavaScript 核心原理的 MD 笔记,旨在通过底层逻辑理解语言特性,欢迎同道中人交流。 #JavaScript #V8引擎 #原型链 #底层原理

相关推荐
lichenyang4534 小时前
鸿蒙业务需求实战:AI 问题走马灯卡片实现复盘
前端
ZTStory4 小时前
mise 一款可以在项目中独立管理语言、环境变量和任务的工具
前端·rust·命令行
lichenyang4535 小时前
鸿蒙业务 UI 实战复盘:AI 问题走马灯卡片与 ArkTS 基础语法
前端
张元清5 小时前
在 React 里写动画又不跟渲染周期较劲:useRafFn、useRafState、useFps、useDevicePixelRatio、useUpdate
前端·javascript·面试
阿隅5 小时前
从 #xxx 私有属性到 WeakMap:彻底搞懂 JS 私有属性的前世今生与编译原理
前端
光影少年6 小时前
Redux 核心流程:Action、Reducer、Store、Dispatch
前端·react.js·掘金·金石计划
咪饭只吃一小碗7 小时前
JS this 身世大揭秘:它到底该听谁的?
前端·javascript
码破天机7 小时前
深度解析|Dify API无法查询Web/调试会话?底层架构隔离原理全覆盖
前端·架构
c238567 小时前
string2
前端·算法