JavaScript中类的内存分配时机:声明时还是实例化时?
JavaScript类声明与内存分配的关系
在JavaScript中,类本质是特殊的函数对象,它的内存分配逻辑和函数有相似性,但要明确区分「类本身的内存」和「类实例的内存」:
一、类声明/表达式执行时,会为类本身分配内存
不管是类声明还是类表达式,当代码执行到类定义语句时,都会立即为类对应的函数对象、以及它的原型对象分配内存:
- 类声明(
class Foo {}):会被变量提升,但仅创建Foo的变量绑定,直到执行到class Foo {}这行代码时,才会生成类函数对象并分配内存,存储构造函数、原型方法、静态属性/方法等内容。注意:声明提升后Foo处于暂时性死区,执行前访问会抛出ReferenceError。 - 类表达式(
const Foo = class {}):和普通变量赋值逻辑一致,执行到赋值语句时,创建类函数对象并分配内存,之后把这个对象赋值给变量Foo。
举个直观的例子:
// 类声明执行前处于暂时性死区,无法访问 // console.log(MyClass); // 抛出ReferenceError // 执行到这行时,为MyClass函数对象、MyClass.prototype分配内存 class MyClass { constructor(age) { this.age = age; // 实例自有属性,创建实例时才分配内存 } sayHi() {} // 存在MyClass.prototype上,类声明时分配内存 static staticFunc() {} // 存在MyClass本身,类声明时分配内存 } // 此时MyClass已是占用内存的函数对象 console.log(typeof MyClass); // 输出:function
二、类实例的内存,仅在创建实例时分配
只有当你通过new 类名()调用类的构造函数时,才会为新的实例对象分配独立内存,存储实例的自有属性(比如例子里的this.age)。实例会继承类原型上的方法,但原型本身的内存是在类声明时就分配好的,不会为每个实例重复分配原型方法的内存。
比如:
// 执行这行时,为instance1分配独立内存 const instance1 = new MyClass(20); // 执行这行时,为instance2分配另一块独立内存 const instance2 = new MyClass(25);
总结
- 类本身的内存:在类声明语句执行(声明式)或表达式赋值(表达式式)阶段分配。
- 类实例的内存:仅在调用
new创建实例时分配。
内容的提问来源于stack exchange,提问作者JessePinkman
相关产品推荐
相关产品推荐

