子类构造器中抛出的异常会直接向上冒泡到new调用点,不会被自动捕获;若super()前抛错,父类构造器不执行;若super()后父类内部出错,错误仍在子类构造上下文中冒泡;异步错误不参与此同步冒泡链。

子类构造器中抛出的异常会直接向上冒泡到调用 new 的位置,不会被自动捕获或拦截。只要没用 try...catch 包裹 new 表达式,错误就会逐层往外传,最终可能终止执行或触发未捕获异常处理机制。
异常冒泡路径很明确:子类 constructor → 父类 constructor(如果 super() 已执行)→ new 调用点
- 如果
super()执行前就抛错(比如参数校验失败、throw new Error('xxx')),那父类构造器根本不会运行,错误直接从子类 constructor 抛出; - 如果
super()成功执行,但父类 constructor 内部出错(如访问 undefined 属性、调用不存在方法),这个错误会在super()调用处被抛出,仍属于子类 constructor 的执行上下文; - 无论错在子类还是父类,只要没被
try...catch捕获,就会一路冒泡到最近的同步调用栈外层。
常见冒泡场景示例:
-
子类构造器开头主动 throw
class Child extends Parent { constructor(name) { if (!name) throw new TypeError('name required'); super(name); // 不会执行到这里 } } -
super()触发父类 constructor 报错class Parent { constructor(name) { if (!name) throw new Error('Parent needs name'); this.name = name; } } class Child extends Parent { constructor(name) { super(name); // 这里抛错,错误源自 Parent } } 父类 constructor 中异步操作出错不会冒泡(因为不是同步抛出)
异步错误需单独处理,比如Promise.reject()或事件监听,它不参与new的同步异常链。
关键点:
-
super()是同步调用,其内部任何同步错误都会立即中断子类 constructor 并冒泡; - 子类 constructor 中
this只有在super()完成后才可用,此前抛错与this无关; - 错误对象保留完整堆栈,包含子类和父类 constructor 的调用帧,便于定位源头。
基本上就这些。











