new 创建对象时,this 指向堆中动态分配的新对象实例,而非自身被分配内存;引擎先在新生代 From 空间分配空对象并绑定原型,再以该对象为 this 执行构造函数,属性赋值即向该内存地址写入数据。

new 绑定过程中,this 本身不“分配内存”,而是指向一个新分配的对象实例——这个对象的内存由 JavaScript 引擎(如 V8)在堆(heap)中动态分配。
new 执行时的内存动作
调用 new Constructor() 时,引擎实际做了四件事,其中前两步直接涉及内存分配:
-
创建空对象并绑定原型:引擎在堆内存中分配一块新空间,生成一个空对象(即未来
this所指的对象),同时将其[[Prototype]]指向Constructor.prototype; -
绑定 this 并执行构造函数:把刚分配的对象作为
this传入构造函数,在该上下文中为它添加属性和方法(比如this.name = 'xxx'); - 处理返回值:若构造函数显式返回一个对象,则返回该对象;否则返回刚创建的
this实例; - 完成对象创建:该实例正式成为可被引用的、有生命周期的对象。
内存区域归属:新生代还是老生代?
新对象默认进入 V8 的新生代内存(Young Generation),采用 Scavenge 算法管理:
- 新生代分为 From 和 To 两个半空间,新对象总在 From 空间分配;
- 当 From 空间使用超过约 25%,触发垃圾回收:存活对象复制到 To 空间,From 被清空;
- 如果对象在一次 GC 后仍存活,或复制时 To 空间已满 25%,它会被晋升到老生代(Old Generation),后续由 Mark-Sweep/Mark-Compact 算法管理。
this 在整个过程中的角色
this 不是变量,也不是被“分配”的值,而是构造函数执行时的上下文引用:
- 它始终指向那个刚刚在堆中分配出来的对象;
- 构造函数内部对
this.xxx = yyy的赋值,本质是往该内存地址上写入属性; - 箭头函数不参与 this 绑定,所以 new 无法改变其 this,它仍继承外层非箭头函数的 this。
常见误解澄清
有人误以为 “this 是 new 分配出来的”,其实准确说是:new 分配了对象,this 指向它。例如:
这里 obj 和构造函数内的 this 是同一块堆内存的两个引用,不是拷贝,也不共享栈空间。

















