箭头函数不能用new调用,因其没有[[construct]]内部方法、无prototype属性,且不支持new.target,执行new会抛出typeerror;需用普通函数或class替代。

直接不用箭头函数当构造函数——它根本就不是为这个设计的。
箭头函数不能 new 的本质原因
箭头函数没有 prototype 属性,也不支持 new.target,更没有内部的 [[Construct]] 方法。当你写 new () => {},JavaScript 引擎发现它不具备构造能力,立刻抛出 TypeError: XXX is not a constructor。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
哪些写法会触发这个错误
const Person = (name) => { this.name = name; }; new Person('Alice');const createObj = () => ({ id: Date.now() }); new createObj();- 在 class 中误把箭头函数赋给实例属性,又试图用 new 调用该属性(如
this.factory = () => {};后再new this.factory())
正确替代方案
需要创建实例对象时,必须使用具备构造能力的函数:
-
普通函数声明/表达式:
function Person(name) { this.name = name; }或const Person = function(name) { this.name = name; }; -
ES6 class:
class Person { constructor(name) { this.name = name; } } - 若只是想返回一个新对象(非实例化),用 工厂函数 + 普通调用:
const createPerson = (name) => ({ name }); const p = createPerson('Bob'); // 不加 new
如何提前发现误用
现代开发中可借助工具规避:
- ESLint 规则
no-new-arrow(推荐启用) - TypeScript 编译期会提示:类型“() => any”上不存在属性“prototype”,无法用 new 调用
- 代码审查时留意
new后紧跟箭头函数定义或变量名(尤其命名含Factory、Creator等字眼时需确认是否真该 new)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










