箭头函数不能作为构造函数,因其缺少[[Construct]]内部方法、无prototype属性、不绑定this/arguments/new.target等构造上下文,这是ES6规范有意设计的取舍。

箭头函数不能作为构造函数,不是语法写错了,也不是浏览器没支持好,而是 JavaScript 规范从一开始就没给它“入场资格”——它压根就不具备构造所需的底层能力。
缺少 [[Construct]] 内部方法
JavaScript 引擎判断一个函数能否被 new 调用,只看它有没有 [[Construct]] 这个内部方法:
- 普通函数(function 声明或表达式)和 class 创建时自动拥有 [[Construct]];
- 箭头函数在 ES6 规范中被明确定义为“仅有 [[Call]],没有 [[Construct]]”;
- 执行 new arrowFn() 时,引擎一检查就发现缺这个方法,立刻抛出 TypeError: xxx is not a constructor,函数体根本不会执行。
没有 prototype 属性
构造函数必须提供一个可访问、可配置的 prototype,用来建立实例的原型链:
- console.log((() => {}).prototype) 输出 undefined;
- 尝试赋值 arrowFn.prototype = {} 在严格模式下静默失败,非严格模式也无效;
- 没有 prototype,新对象就无法通过 __proto__ 指向它,继承机制完全失效。
不绑定 this、arguments、new.target 等构造上下文
构造调用依赖一套完整的运行时环境,而箭头函数全部缺失:
- this 是词法绑定的,静态捕获外层作用域的值,无法在 new 时动态指向新实例;
- arguments 对象不可访问(需改用 rest 参数 ...args);
- new.target 在箭头函数里始终为 undefined,无法识别是否被 new 调用;
- 没有 [[HomeObject]],所以不支持 super,无法用于类继承场景。
这是有意为之的设计选择
ES6 引入箭头函数的目标很明确:提供轻量、无状态、专注计算的函数表达式,尤其适合回调、映射、事件处理等场景。它放弃构造能力,是为了避免语义混淆:
- 防止误把 () => ({ name: 'x' }) 当成构造器(它返回的是字面量对象,不是实例);
- 避免词法 this 与构造时的动态 this 绑定发生冲突;
- 保持语言行为清晰可预测——需要建模类型,就用 function 或 class;需要简洁回调,就用箭头函数。

















