箭头函数不能被new调用,因其无[[Construct]]内部方法、无prototype属性、不绑定this/new.target等构造上下文,这是ES6有意设计的语法限制。

因为箭头函数从语言设计上就被排除在构造流程之外——它没有 [[Construct]] 内部方法,也没有 prototype 属性,更不参与 this、new.target 等构造上下文的初始化。
引擎根本不给箭头函数“入场资格”
JavaScript 引擎判断一个函数能否被 new 调用,只看它有没有 [[Construct]] 这个内部方法:
- 普通函数(包括 function 声明、表达式)和 class 创建时自动获得
[[Construct]]; - 箭头函数在 ES6 规范中被明确定义为“仅含
[[Call]],不含[[Construct]]”; - 执行
new (() => {})时,引擎一检查就发现缺失该方法,立刻抛出TypeError: xxx is not a constructor,连函数体都不会执行。
没有 prototype,原型链无从建立
构造函数必须提供可访问的 prototype,用来设置新对象的 [[Prototype]]:
-
console.log((() => {}).prototype)输出undefined; - 即使尝试赋值
arrowFn.prototype = {},在严格模式下静默失败,非严格模式也无效; - 没有
prototype,新对象就无法通过__proto__指向它,继承机制完全失效。
this 和其他构造上下文全部缺失
构造调用依赖一套完整的运行时环境,而箭头函数对这些关键上下文不做任何绑定:
立即学习“Java免费学习笔记(深入)”;
-
this是词法绑定的,无法在new时动态指向新实例; -
arguments对象不存在,只能用 rest 参数替代; -
new.target始终为undefined,无法识别是否被构造调用; - 没有
[[HomeObject]],所以不支持super,也无法用于类继承场景。
这是有意为之的设计,不是缺陷
ES6 引入箭头函数的目标很明确:提供轻量、无状态、专注计算的函数表达式,尤其适合回调、映射、事件处理等场景:
- 避免把
() => ({})误当成构造器(它返回字面量对象,不是实例); - 防止词法
this与构造时的动态this发生语义冲突; - 保持语言行为清晰可预测——需要建模类型,就用
function或class;需要简洁回调,就用箭头函数。


















