constructor 在 new 实例化时立即执行,是类初始化的第一步;它仅在 new myclass() 时被调用,继承时需先调用 super() 以触发父类 constructor,类字段在 super() 后、constructor 主体前初始化。

constructor 在 new 实例化时立即执行,且是类初始化过程的第一步。 它不是定义时运行,也不是模块加载时触发,而是每次调用 new MyClass() 时,引擎自动调用的唯一入口函数。
constructor 的执行时机
它只在创建实例对象的那一刻运行:
- 写好 class 并不执行 constructor;
- import 或 require 类文件,也不触发 constructor;
- 只有
new MyClass(...)这一行代码执行时,constructor 才被调用; - 如果类继承自父类,子类 constructor 中必须先调用
super(),此时父类 constructor 会同步执行(顺序:父类 constructor → 子类 constructor)。
constructor 内部的执行顺序
当 constructor 函数体开始执行,内部遵循常规 JS 执行流,但有明确的初始化逻辑顺序:
- 先创建空对象,并设置其
[[Prototype]]指向类的prototype; - 将 this 绑定到该新对象;
- 按代码从上到下执行语句(如赋值、方法调用等);
- 若未显式 return 对象,则默认返回 this(即新实例);
- 类字段(如
prop = 1)会在 constructor 函数体执行前初始化(ES2022 起支持,实际发生在 super() 返回后、constructor 主体执行前)。
与类声明、模块加载的关系
constructor 和这些阶段完全解耦:
- 类声明本身只是语法定义,不运行任何代码;
- 模块加载(解析→实例化→执行)阶段,class 只被“注册”,constructor 不执行;
- 即使类中定义了静态属性或方法,也不会触发 constructor;
- 只有主动 new 实例,才启动构造流程。
常见误区提醒
容易混淆的几个点:
- constructor 不是“类定义时就执行”——类可以存在多年,不 new 就永远不运行;
- 它不是“模块执行时顺带执行”——模块里 class 声明完,后续无 new,constructor 就静默;
- 继承链中,
super()是显式调用父构造器的信号,不是可选步骤,缺了会报错; - 箭头函数、async 函数不能作为 constructor——它必须是普通函数,且不能有 return 非对象值(否则可能覆盖实例)。











