箭头函数不能用作构造函数,因其没有[[Construct]]内部方法、无prototype属性、不绑定this/arguments/super/new.target,且设计上明确区分非构造型函数角色。

箭头函数不能用作构造函数,根本原因在于它**没有自己的 [[Construct]] 内部方法**,也不具备构造调用所需的执行上下文机制。
箭头函数缺少 [[Construct]] 内部方法
在 JavaScript 规范中,只有具有 [[Construct]] 内部方法的函数对象才能通过 new 调用。普通函数(FunctionDeclaration、FunctionExpression、class)在创建时会被赋予该方法;而箭头函数在语法定义阶段就被明确排除——它的内部方法只包含 [[Call]],不包含 [[Construct]]。
当执行 new foo() 时,引擎会检查 foo 是否有 [[Construct]]。若无,直接抛出 TypeError: xxx is not a constructor。
箭头函数没有原型对象(prototype)
构造函数必须有一个可写的 prototype 属性,用于挂载实例共享的方法和属性。箭头函数**没有 prototype 属性**(其 prototype 是 undefined),因此即使绕过语法限制,也无法支持原型链继承。
立即学习“Java免费学习笔记(深入)”;
-
function Foo() {}→Foo.prototype是一个对象 -
const Bar = () => {};→Bar.prototype是undefined
箭头函数不绑定 this、arguments、super、new.target
构造调用依赖 this 绑定到新创建的实例,并需要访问 new.target 来判断是否被 new 调用。箭头函数的 this 是词法绑定的,new.target 在其中不可访问(始终为 undefined),且没有 arguments 对象。
这意味着它无法完成构造函数的核心行为:初始化实例、设置原型、响应构造器语义。
设计意图:明确区分函数角色
ES6 引入箭头函数的初衷是提供更简洁的非构造型函数表达式,尤其适合回调、映射、事件处理等场景。它刻意放弃构造能力,是为了避免语义混淆——比如防止开发者误以为 () => ({}) 可以用来“构造”对象(实际返回的是字面量对象,不是实例)。
这种限制不是实现缺陷,而是规范层面的主动约束。










