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
相关产品推荐
相关产品推荐

