Javascript - 请问可以new一个箭头函数吗?

2024-06-17 1028阅读

🚐new操作符的步骤

在JavaScript中,new 操作符用于创建一个对象实例,具体来说,它会执行以下几步操作:

Javascript - 请问可以new一个箭头函数吗?
(图片来源网络,侵删)
  1. 创建一个新对象: 创建一个新的空对象,且这个对象的 __proto__ 属性会被设置为构造函数的 prototype 属性。

  2. 设置原型链: 将这个新对象的 __proto__ 属性指向构造函数的 prototype 属性,从而实现新对象继承构造函数的原型方法和属性。

  3. 绑定 this 并执行构造函数: 将构造函数中的 this 绑定到这个新对象上,并执行构造函数,传递给构造函数的参数也会传递到此函数中。

  4. 返回新对象: 如果构造函数显式地返回一个对象,那么这个对象将作为 new 表达式的结果返回。否则,返回步骤1中创建的新对象。

以下是用代码详细描述这些步骤:

function myNew(constructor, ...args) {
  // 1. 创建一个新对象
  const obj = {};
  
  // 2. 设置原型链
  Object.setPrototypeOf(obj, constructor.prototype);
  
  // 3. 绑定 this 并执行构造函数
  const result = constructor.apply(obj, args);
  
  // 4. 返回新对象
  return result instanceof Object ? result : obj;
}
// 示例构造函数
function Person(name, age) {
  this.name = name;
  this.age = age;
}
const person = myNew(Person, 'John', 30);
console.log(person.name); // John
console.log(person.age);  // 30

让我们一步一步来理解 new 操作符执行的这些步骤:

🤦‍♀️创建一个新对象:

const obj = {};

🤦‍♀️设置原型链:

Object.setPrototypeOf(obj, constructor.prototype);

或者在现代浏览器中可以直接使用:

obj.__proto__ = constructor.prototype;

🤦‍♀️绑定 this 并执行构造函数:

const result = constructor.apply(obj, args);

这里 apply 方法用于将 this 绑定到新创建的对象上,并传递参数给构造函数。

🤦‍♀️返回新对象:

return result instanceof Object ? result : obj;

如果构造函数返回一个对象,则返回该对象;否则,返回新创建的对象。

这种模拟 new 操作符的实现有助于深入理解它的工作原理。总的来说,new 操作符在创建对象的过程中,主要负责设置对象的原型链、执行构造函数以及返回新对象。

🚐那么箭头函数在本小节中又有哪些表现或者特征呢?

ES6引入的箭头函数(Arrow Functions)具有一些独特的特征,使它们在特定场景下比传统函数更加简洁和方便。以下是箭头函数的主要特征:

🤦‍♀️1 没有自己的 this 绑定

箭头函数没有自己的 this 值,它会捕获上下文中的 this 值(即定义时的 this),而不是调用时的 this。这意味着在箭头函数中,this 始终指向它外部作用域的 this。

function Person() {
  this.age = 0;
  
  setInterval(() => {
    this.age++; // `this` 正确指向 Person 对象
    console.log(this.age);
  }, 1000);
}
const p = new Person();

🤦‍♀️2 没有 arguments 对象

箭头函数没有自己的 arguments 对象。如果需要使用 arguments,可以使用 rest 参数(...args)代替。

const sum = (...args) => args.reduce((a, b) => a + b, 0);
console.log(sum(1, 2, 3)); // 6

🤦‍♀️3 不能用作构造函数

箭头函数不能使用 new 关键字调用,因为它们没有 [[Construct]] 方法,不支持 new 操作符。

const Foo = () => {};
const bar = new Foo(); // TypeError: Foo is not a constructor

🚐总结

由此可见,箭头函数哇,设置原型链 和 绑定 this 并执行构造函数 这两步无法达成,或者说实现不了。

但这完全不影响我们在前端项目中开心的使用箭头函数,你说你没事干new他干啥,面试官你非瞎问这个干啥。直接弄出个项目,你就让他干,考察一下,差不多得了呗,非有的没的瞎问。

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]