[路飞]_对于分析一下箭头语法为什么不能当做构造函数面试题的思考

173 阅读2分钟

箭头函数的定义

**箭头函数表达式**的语法比函数表达式更简洁,并且没有自己的thisargumentssupernew.target。箭头函数表达式更适用于那些本来需要匿名函数的地方,并且它不能用作构造函数

定义中明确说明箭头函数不能做为构造函数,至于是为什么箭头函数不能作为构造函数,我觉得这个就是这个箭头函数本身给设计的时候,就是为了解决某些方面的问题如this的指向,还有代码的简洁易用等方面考虑的吧。所以箭头函数和普通函数的一些属性上就有区分,如下面的这些

  • 没有单独的this
  • 不绑定arguments
  • 箭头函数不能用作构造器,和 new一起用会抛出错误
  • 箭头函数没有prototype属性 而这些属性的缺失,又刚好是普通函数调用new创建实例过程必要的存在的属性,所以箭头函数不能当构造函数。

对于这道题我的一些想法

我觉得这个问题就是和设计者的想法有关系,回答的时候就说是定义就这样子也没有毛病。就比如自己在写程序的时候,我觉得这样做就是最好的,所以我就给你提供这些东西。但是面试的时候肯定不可以这样的,所以我觉得这道题更加考察的是对箭头函数和普通函数的区别是什么,然后普通函数在调用new的时候发生了什么事情,然后根据这些知识去辩证这个问题,通过这些面试官就可以知道你对这些知识掌握的程度和辩证思维是怎样的。

引用下然叔文章中的模拟的new 实例过程

function myNew(fn, ...args) {
  // 创建一个空对象
  const obj = {};
  // 将该对象的 __proto__ 属性链接到构造函数原型对象
  // ❌ 缺少fn.prototype
  obj.__proto__ = fn.prototype;
  // 将该对象作为 this 上下文调用构造函数并接收返回值
  // ❌ 没有自己的this
  // ❌ call()函数无法改变箭头函数的指向
  const res = fn.apply(obj, args);
  // 如果返回值存在并且是引用数据类型,返回构造函数返回值,否则返回创建的对象
  return typeof res === "object" ? res : obj;
}

作者:全栈然叔
链接:juejin.cn/post/705047…