箭头函数不能用 new 调用,因其缺少 [[Construct]] 内部方法、无 prototype 属性、不绑定构造上下文,这是 ES6 有意设计,以明确区分构造器与轻量回调函数。
箭头函数不能用 new 调用,不是写法错了,也不是浏览器没支持好,而是 JavaScript 引擎从底层就拒绝让它参与构造流程。
引擎判断一个函数能不能被 new 调用,只看它有没有 [[Construct]] 这个内部方法:
function 声明或表达式)和 class 创建时,自动带 [[Construct]];[[Call]],没有 [[Construct]];new arrowFn() 时,引擎一检查就发现缺这个方法,立刻抛出 TypeError: xxx is not a constructor,连函数体都不会运行。构造函数必须提供一个可访问、可配置的 prototype,用来建立实例的原型链:
console.log((() => {}).prototype) 输出 undefined;arrowFn.prototype = {},在严格模式下会静默失败,非严格模式也无效;prototype,新对象就无法通过 __proto__ 指向它,继承机制直接失效。构造调用依赖一套完整的运行时上下文,而箭头函数全部缺失:
立即学习“Java免费学习笔记(深入)”;
this 是词法绑定的,无法在 new 时动态指向新创建的实例;arguments 对象不存在,没法访问传入参数;new.target 始终为 undefined,无法判断是否被构造调用;super 不可用,子类中无法正确调用父类构造逻辑。ES6 引入箭头函数的目标很明确:提供轻量、无状态、专注计算的函数表达式,尤其适合回调、映射、事件处理等场景。
() => ({}) 当成构造器(它返回的是字面量对象,不是实例);this 的词法绑定与构造时的动态绑定发生冲突;function 或 class;需要简洁回调,就用箭头函数。