javascript中constructor抛异常会原样冒泡,new不捕获错误;实例创建失败,无对象返回,类字段初始化按序执行;继承时super()抛错也会终止流程;调用方须显式try/catch处理。

当 JavaScript 中 constructor 执行失败(比如抛出异常),该异常会直接向上层调用栈传递,不会被自动捕获或静默忽略;new 表达式本身不会吞掉错误,而是让异常原样冒泡,调用方必须显式处理。
constructor 抛异常 = 实例创建失败
只要构造函数体内执行 throw 语句(或调用抛错的函数、访问 undefined 属性等),new 操作就会立即中止,不返回任何实例,也不会执行原型链绑定或 this 初始化完成后的逻辑。
- 返回值为 undefined,且没有对象被构造出来
- this 在抛错前已绑定(但通常无法访问,因执行流中断)
- 类字段初始化(public field / #private)若在抛错前已完成,则仍会执行;若在抛错后,则跳过
异常由 new 调用点直接接收
new 的调用者负责 try/catch —— 构造函数不自带异常兜底。这和普通函数调用行为一致,只是语义上强调“实例化失败”。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
class BadClass {
constructor() {
throw new Error('init failed');
}
}
try {
const inst = new BadClass(); // 这里直接抛出
} catch (e) {
console.log(e.message); // 'init failed'
}
继承场景下异常仍逐层向上透出
子类 constructor 中 super() 调用父类 constructor;若父类抛错,错误会在 super() 行抛出,子类后续代码不执行,整个 new 流程终止。
- super() 是显式调用,不是隐式包装,错误不会被子类自动拦截
- 可在 super() 周围加 try/catch,但通常不推荐 —— 错误应由最终使用者决定如何应对
- 如果 super() 成功但子类自己的逻辑抛错,异常同样冒泡到 new 调用点
常见易忽略点
某些看似“安全”的操作实际可能抛错,导致 constructor 失败却不明显:
- 解构赋值时源为 null/undefined:
const { x } = options; - 调用外部 API 或依赖未检查的参数:
this.id = id.toUpperCase();(id 为 null 时 TypeError) - 使用 require/import 动态加载失败(Node.js 环境)
- Promise 构造函数中 throw 不会阻止实例创建,但这是 Promise 内部行为,不属于 constructor 执行期错误
不复杂但容易忽略:constructor 就是普通同步函数,它的异常处理规则完全遵循 JavaScript 错误传播机制 —— 没有魔法,只有明确的调用链和 try/catch 边界。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










