You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JS Strict Mode下如何创建Constructor构造函数解决this指向问题

核心结论

ES6 类语法默认运行在严格模式下,只要通过new关键字调用构造函数,this会自动绑定到新创建的实例,不会出现undefined的问题。你当前的代码问题和严格模式的this规则无关,核心是自定义错误类的实现不符合JavaScript错误对象的规范。

具体修正方案

推荐写法:继承内置Error类

自定义错误类型必须继承原生Error,才能获得完整的堆栈追踪、错误类型识别能力,该写法在所有支持ES6的严格模式环境(包括所有维护版本的Node.js)下都能正常运行:

class MyError extends Error {
  constructor(message, code) {
    super(message);
    // 修正错误实例的name属性,默认值为Error
    this.name = 'MyError';
    // 挂载自定义的错误码属性
    this.code = code;
    // 兼容Node.js等环境,捕获准确的调用栈,排除构造函数自身的栈帧
    if (Error.captureStackTrace) {
      Error.captureStackTrace(this, MyError);
    }
  }
}

修正后你原有的fetch逻辑不需要改动,throw new MyError(response.statusText, response.status)能正常生成错误实例,catch块中可以正常读取err.message和err.code属性。

兼容旧环境的构造函数写法

如果不使用class语法,传统构造函数只要始终通过new调用,严格模式下也能正常工作,不需要额外处理this绑定:

'use strict';
function MyError(message, code) {
  // new调用时,严格模式下this依然指向新创建的实例
  this.message = message;
  this.code = code;
  this.name = 'MyError';
  if (Error.captureStackTrace) {
    Error.captureStackTrace(this, MyError);
  }
}
// 手动建立原型继承关系
MyError.prototype = Object.create(Error.prototype);
MyError.prototype.constructor = MyError;
避坑说明
  • 只有当你不使用new、直接把构造函数当普通函数调用时,严格模式下构造函数内的this才会是undefined,这种调用方式本身就是错误的,正常实例化场景不会触发。
  • 不继承Error的普通类虽然也能挂载message和code属性,但无法被控制台、日志工具、错误监控系统识别为标准错误对象,也拿不到调用堆栈,不建议使用。

内容的提问来源于stack exchange,提问作者user16929274

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 21:31:09