JavaScript中class的非静态属性在super()返回后、constructor执行前按书写顺序初始化,this已绑定但不可访问构造参数;字段初始化仅支持简单默认值或依赖已初始化字段的计算,复杂逻辑须移入constructor。

JavaScript 中 class 内部定义的非静态属性(即实例字段)在每次 new 实例时、构造函数执行前立即初始化,按源码中从上到下的声明顺序依次进行。
执行时机:在 super() 返回之后、constructor 主体开始之前
当创建子类实例时,非静态属性的初始化严格发生在 super() 调用返回之后、子类 constructor 函数体执行之前。此时:
-
this 已绑定,可以安全访问(例如
this.a = this.b + 1) -
构造函数参数尚未传入,无法在字段初始化器中直接使用
id、args等参数 - 父类字段先完成初始化,子类字段才能读取父类已初始化的值
初始化顺序:严格按书写顺序,且继承链自上而下
字段初始化不是“一次性收集后统一赋值”,而是逐行执行:
- 若类中写为
a = 1; b = this.a + 2; c = this.b * 3;,则b一定能读到a的值,c也一定能读到b的值 - 在继承中:父类字段 → 父类 constructor → 子类字段 → 子类 constructor
- 即使字段穿插在方法之间,引擎仍按代码物理位置顺序执行初始化
和 constructor 内赋值的关键区别
看似都是给实例加属性,但阶段不同、能力不同:
立即学习“Java免费学习笔记(深入)”;
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 字段初始化器:不能访问构造参数,不能做条件判断,不能 await 异步操作,不能调用未定义的方法
- constructor 内赋值:可读取参数、可写 if/else、可 await、可调用 this 上任意方法(包括父类方法)
- 字段初始化器更适合表达“固定默认值”或“仅依赖已初始化字段”的简单计算
常见误用与正确写法
以下写法会出错:
❌ 错误示例:class User { name = this.opts?.name; constructor(opts) { this.opts = opts; } } —— this.opts 还未赋值,抛 ReferenceError
把依赖参数的逻辑移进 constructor:
class User { name; constructor(opts) { this.name = opts?.name ?? 'anonymous'; } }

















