箭头函数没有 prototype 属性,因其设计上禁止 new 调用,不具 [[Construct]] 内部方法;故无法实例化、不支持 instanceof、不能作为构造器或类组件方法、也无法扩展原型。

箭头函数没有原型对象,不是因为“忘了加”,而是设计上就排除了构造行为——它压根不参与实例化流程。
为什么没有 prototype 属性
原型(prototype)存在的根本意义,是为 new 调用提供实例化依据:普通函数被 new 时,引擎会读取其 prototype 属性,把该对象赋给新实例的 __proto__。而箭头函数明确禁止 new 调用,所以连这个环节都不进入,自然不需要 prototype。
- 执行
(() => {}).prototype得到undefined - 执行
new (() => {})直接抛出TypeError: xxx is not a constructor - 它没有 [[Construct]] 内部方法,这是 JavaScript 规范层面的硬性限制
没有 prototype 带来的实际影响
这不只是“少一个属性”那么简单,它切断了几条关键能力链:
-
无法通过 instanceof 判断类型归属:因为 instanceof 依赖原型链查找,而箭头函数没有 prototype,也就无法作为右侧操作数(
obj instanceof ArrowFn语法报错) -
不能用于类组件或构造逻辑:比如 React 类组件中,不能把
render写成箭头函数并期望它被实例化;也不能用它封装私有状态后返回新实例 -
无法手动扩展原型方法:你不能像
function A(){}; A.prototype.foo = () =>{}那样给箭头函数加方法——它连 prototype 这个容器都没有
对比普通函数更清楚
普通函数默认自带 prototype(值为一个含 constructor 的对象),哪怕你从不 new 它;而箭头函数在定义那一刻就确定:它只做计算或回调,不承载任何继承意图。
立即学习“Java免费学习笔记(深入)”;
-
function F() {}→F.prototype是一个对象 -
const f = () => {}→f.prototype是undefined
说到底,没有 prototype 不是缺陷,是信号:它在告诉你——这个函数不该、也不能被当作构造器来用。


















