函数表达式可作为构造函数使用,箭头函数完全不能;前者有prototype属性和[[construct]]方法,支持new实例化,后者无prototype、无[[construct]],new调用必抛typeerror。

函数表达式可以作为构造函数使用,箭头函数完全不能。
函数表达式支持 new 实例化
用 function 关键字定义的函数表达式(包括具名或匿名形式)拥有 prototype 属性,能被 new 操作符调用,从而创建新实例。
- 例如:
const Person = function(name) { this.name = name; }; -
const p = new Person('Alice');✅ 成功执行,p是Person的实例 - 此时
Person.prototype可挂载共享方法,符合面向对象设计逻辑
箭头函数无法用作构造函数
箭头函数没有 prototype,也不具备 [[Construct]] 内部方法。一旦尝试用 new 调用,JavaScript 引擎会立即抛出 TypeError: xxx is not a constructor。
- 例如:
const ArrowPerson = (name) => { this.name = name; }; -
new ArrowPerson('Bob');❌ 报错,不进入函数体执行 - 即使函数体为空或只含简单语句,也无法绕过该限制
为什么设计成这样?
箭头函数的核心定位是“轻量级函数值”,用于回调、映射、过滤等场景,而非构建对象实例。它刻意剥离了与实例化相关的机制(如 this 绑定、prototype、arguments),以保持语义简洁和行为可预测。
- 没有
prototype→ 无法设置原型链继承 - 没有 [[Construct]] → 语言层面禁止
new调用 - 不绑定
this→ 即使强行模拟,也无法在实例中正确初始化属性
实际开发中的应对方式
若需构造逻辑,应明确区分用途:
- 需要实例化 → 坚持用函数表达式或类(
class) - 只需数据转换或事件回调 → 优先选箭头函数,避免
this陷阱 - 想复用构造逻辑但又想写得简洁?可封装为工厂函数:
const createPerson = (name) => ({ name });—— 返回普通对象,不依赖new










