箭头函数不能用作构造函数,因其缺少[[construct]]内部方法、prototype属性及构造上下文(this、arguments、new.target等),这是es6有意为之的设计选择。

箭头函数不能用作构造函数,不是语法写错了,也不是引擎没实现好,而是 JavaScript 规范从设计上就禁止它参与构造流程。它压根就没有“入场资格”——既没有构造能力,也不该承担构造职责。
缺少 [[Construct]] 内部方法
JavaScript 引擎判断一个函数能否被 new 调用,不看名字、不看写法,只查它有没有 [[Construct]] 这个内部方法。这是 ECMAScript 规范定义的底层机制:
- 普通函数(function 声明/表达式)和 class 在创建时自动获得 [[Construct]];
- 箭头函数在语言设计阶段就被明确排除,它的内部方法列表里只有 [[Call]],没有 [[Construct]];
- 执行 new arrowFn() 时,引擎一检查就发现缺这个方法,直接抛出 TypeError: xxx is not a constructor,连函数体都不会执行。
没有 prototype 属性
构造函数必须提供一个可访问、可配置的 prototype,用来建立实例的原型链。而箭头函数的 prototype 是 undefined:
-
console.log((() => {}).prototype)输出undefined; - 尝试赋值
arrowFn.prototype = {}在严格模式下静默失败,非严格模式下也无效; - 没有 prototype,新对象就无法通过
__proto__指向它,继承机制彻底失效。
不绑定 this、arguments、new.target 等构造上下文
构造调用依赖一套完整的运行时上下文,而箭头函数全部缺失:
- this 是词法绑定的,无法在 new 时动态指向新实例;
- arguments 对象不存在,无法访问传参;
-
new.target 始终为
undefined,无法判断是否被构造调用; - super 不可用,无法在子类中正确调用父类构造逻辑。
这是有意为之的设计选择
ES6 引入箭头函数,目标很明确:提供轻量、无状态、专注计算的函数表达式,尤其适合回调、映射、事件处理等场景。它放弃构造能力,是为了避免语义混淆:
- 防止开发者误把
() => ({})当成构造器(它返回的是字面量对象,不是实例); - 避免 this 的词法绑定与构造时的动态绑定发生冲突;
- 保持语言行为清晰可预测——需要建模类型,就用 function 或 class;需要简洁回调,就用 =>。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











