箭头函数不能用 new 调用,根本原因是其规范层面缺失 [[Construct]] 内部方法、无 prototype 属性、不绑定构造所需运行时上下文,这是 ES6 有意设计的轻量函数特性。

箭头函数不能用 new 调用,根本原因不是写法不对或引擎不支持,而是它从语言规范层面就被设计为“无构造能力”的函数类型。
缺少 [[Construct]] 内部方法
JavaScript 引擎判断一个函数能否被 new 调用,只看它是否具备 [[Construct]] 这个内部方法。这是 ECMAScript 规范定义的底层机制:
- 普通函数(
function声明或表达式)和class在创建时自动拥有 [[Construct]]; - 箭头函数在规范中被明确排除,其内部方法列表里只有 [[Call]],没有 [[Construct]];
- 执行
new arrowFn()时,引擎一检查就发现缺失该方法,立刻抛出TypeError: xxx is not a constructor,函数体甚至不会执行。
没有 prototype 属性
构造函数必须提供可访问、可配置的 prototype,用于建立实例的原型链:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
console.log((() => {}).prototype)输出undefined; - 尝试赋值
arrowFn.prototype = {}在严格模式下静默失败,非严格模式也无效; - 没有
prototype,新对象就无法通过__proto__指向它,继承机制完全失效。
不绑定构造所需的运行时上下文
构造调用依赖一套动态的执行环境,而箭头函数全部缺失:
立即学习“Java免费学习笔记(深入)”;
-
this是词法绑定的,无法在new时动态指向新实例; -
arguments对象不存在,无法访问传参(需改用 rest 参数); -
new.target始终为undefined,无法判断是否被构造调用; - 没有
[[HomeObject]],所以不支持super,无法参与类继承逻辑。
这是有意为之的设计选择
ES6 引入箭头函数的目标很明确:提供轻量、无状态、专注计算的函数表达式,尤其适合回调、映射、事件处理等场景:
- 防止误把
() => ({})当成构造器(它返回字面量对象,不是实例); - 避免词法
this与构造时动态this发生语义冲突; - 保持语言行为清晰可预测——需要建模类型,就用
function或class;需要简洁回调,就用箭头函数。

















