构造函数实例化时,new 操作符自动在堆内存中创建独立对象,设置原型链,以 this 执行构造函数体,并默认返回该对象;仅 this 添加的属性和方法占用独立内存,prototype 上的成员共享。

构造函数在实例化时,会为每个新对象分配独立的堆内存空间,用于存储该实例独有的属性和状态。这个过程由 new 操作符驱动,不是手动申请,而是 JavaScript 引擎自动完成的。
new 执行时的内存分配四步
当你写 const obj = new Person("张三", 25),引擎内部实际做了以下四件事:
- 在堆内存中创建一个全新的空对象(
{}) - 将该对象的内部
[[Prototype]]链接到Person.prototype - 以该新对象为
this,执行Person函数体(此时所有通过this.xxx = xxx赋值的属性,都写入这个新对象的私有内存) - 若构造函数没有显式返回对象,则自动返回这个新对象
哪些内容占用独立内存
只有**实例成员**(即构造函数体内用 this 显式添加的属性和方法)才会被复制到每个实例的独立内存中:
-
this.name = "张三"→ 每个实例都有自己的name字符串副本 -
this.id = Date.now()→ 每个实例的id值互不干扰 -
this.sing = function() { ... }→ ❌ 危险!每次实例化都会新建一个函数,占用多份内存
哪些内容不占独立内存(共享)
定义在 Constructor.prototype 上的方法和属性,只存一份,在所有实例间共享:
Person.prototype.sing = function() { console.log(this.name) }- 调用
obj1.sing()和obj2.sing()实际执行的是同一个函数体 - 可通过
obj1.sing === obj2.sing返回true验证
验证内存独立性的简单方式
修改一个实例的属性,不影响其他实例:
const a = new Person("A", 20); const b = new Person("B", 22)-
a.age = 99→ 只改a的age,b.age仍是22 - 但若误把方法写在构造函数里:
this.getName = () => this.name,则a.getName !== b.getName
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











