new关键字执行四步:1.创建空对象并设[[prototype]]指向构造函数prototype;2.以该对象为this执行构造函数;3.若无对象返回则默认返回该对象;4.通过[[prototype]]指针链实现属性动态查找。

JavaScript 中 new 关键字看似简单,背后其实是一套围绕对象内存布局与原型链指针的精密操作。它不涉及 JVM 那样的类加载和堆空间管理,而是聚焦于 JavaScript 引擎如何在运行时动态构造对象、建立原型连接、绑定执行上下文。核心就四步,每一步都直接操控对象的内部指针关系。
第一步:创建空对象并初始化内部原型指针([[Prototype]])
引擎首先在堆内存中分配一个全新的普通对象({}),但关键不是“空”,而是立即设置它的内部属性 [[Prototype]]——这个隐藏指针被指向构造函数的 prototype 对象。
- 例如
new Person(),新对象的[[Prototype]]会指向Person.prototype - 这个指针决定了后续属性查找的起点,是整个原型链的根基
- 注意:
__proto__是该内部指针的可访问别名(非标准但广泛支持),而[[Prototype]]才是规范中的真实内部槽位
第二步:绑定 this 并执行构造函数(改变执行上下文指针)
引擎将刚创建的对象作为 this 的值,调用构造函数。此时函数体内的所有 this.xxx = yyy 操作,实际是在往那个新对象的自有属性表中写入数据。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 这步不创建新内存,只是让函数代码“落笔”在指定对象上
-
this的指向本质是执行上下文(ExecutionContext)中 ThisBinding 的一次重置 - 若构造函数显式返回一个对象,则跳过后续步骤;否则继续
第三步:隐式返回对象引用(返回堆中对象的地址指针)
如果构造函数没有返回对象类型值,引擎自动返回第一步创建的那个对象的引用——也就是指向堆中该对象内存地址的指针。
- 这个指针就是你在代码中拿到的实例,比如
const p = new Person()中的p - 它本身是一个“引用值”,存储在栈中,内容是堆内存中对象的起始地址
- 多次
new同一构造函数,每次返回的都是不同地址的指针,保证实例隔离
第四步:原型链指针生效(属性访问时的动态查找机制)
这步不在 new 执行过程中主动发生,但它是前三步设计的最终目的:当访问实例属性(如 p.name)时,引擎按如下指针路径查找:
- 先查实例自身属性表(自有属性)
- 未命中 → 沿
[[Prototype]]指针跳转到Person.prototype - 再查其属性表;仍未命中 → 继续沿
Person.prototype.[[Prototype]]向上,直到null - 整个链条由一系列
[[Prototype]]指针串联而成,构成单向链表结构
这四步没有类加载、没有方法区、没有静态编译期绑定——全部靠运行时指针跳转实现。理解 [[Prototype]] 和 this 的指针语义,就抓住了 new 的本质。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










