唯一规避方法是不将箭头函数用作构造函数,因其规范层面缺失[[Construct]]内部方法、prototype属性及this/new.target/arguments,调用new立即抛TypeError;替代方案包括function声明、class或工厂函数。

直接规避的方法只有一个:不把箭头函数当作构造函数用。这不是运行时能“绕过”的问题,而是 JavaScript 引擎在执行 new 的第一刻就拒绝的硬性限制。
根本原因不可绕过
引擎检查的是函数对象是否具备 [[Construct]] 内部方法。箭头函数在规范层面被定义为“仅含 [[Call]]”,没有 [[Construct]],也没有 prototype 属性,this、new.target、arguments 全部缺失或无效。一旦写 new () => {},立刻抛出 TypeError: xxx is not a constructor,连函数体都不会执行。
替代方案要明确区分用途
若你需要创建实例,应选用真正支持构造调用的语法形式:
- 用 function 声明/表达式:它天然带
[[Construct]]和可写的prototype - 用 class:语义清晰、强制
new、支持继承和new.target - 用 工厂函数(返回对象):比如
const createUser = (name) => ({ name }),这不依赖new,也无需this
误用场景的预防措施
常见误用多发生在动态赋值或高阶函数中。可通过以下方式提前拦截:
- 在代码审查或 ESLint 中启用
no-new-func或自定义规则,禁止对箭头函数使用new - 若需统一构造入口,封装成普通函数,并在开头用
if (!new.target)强制校验调用方式 - 在 TypeScript 中,箭头函数类型本身就不兼容
new操作符,编译期即可报错
不要尝试“修复”箭头函数
以下操作均无效:
-
arrowFn.prototype = {}:静默失败,属性不可配置 -
Object.defineProperty(arrowFn, 'prototype', {...}):在严格模式下报错,非严格下也无效果 - 用
Proxy包裹箭头函数并监听construct:Proxy 的construct捕获器只对具有[[Construct]]的目标生效,箭头函数无法作为合法目标

















