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

🚐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他干啥,面试官你非瞎问这个干啥。直接弄出个项目,你就让他干,考察一下,差不多得了呗,非有的没的瞎问。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/853068.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LabVIEW结构体内部缺陷振动检测

结构体内部缺陷会改变其振动特性,通过振动分析可以检测并定位这些缺陷。本文详细分析内部缺陷对振动的影响,从频谱分析、时域分析和模态分析等多角度探讨基于LabVIEW的检测方法,提供实施步骤和注意事项,帮助工程师有效利用LabVIEW…

如何解决跨境传输常见的安全及效率问题?

在当今全球化的商业版图中,企业为了拓展国际市场和增强竞争力,跨境传输数据已成为一项不可或缺的业务活动。合格的数据跨境传输方案,应考虑以下要素: 法律合规性:确保方案符合所有相关国家的数据保护法律和国际法规&am…

对大数据的批量导入MySQL数据库

自己的库里有索引在用insert导入数据时会变慢很多 使用事务批量导入 可以配置使用springmybatis整合的方式关闭自动提交事务(地址),选择批量导入每一百条导入使用list存储值传入到mybatis中 http://x125858805.iteye.com/blog/2369243 list.a…

c语言中的gets()函数记录

C语言中的gets()函数用于从标准输入(通常是键盘)中读取一行输入,并将其存储为C字符串。该函数会读取输入直至遇到换行符(\n),然后丢弃换行符,将其余字符存储在字符串中,并在字符串末…

ATF是如何完成双系统切换的?

ATF(Arm Trusted Firmware)是一个用于ARM架构处理器的可信固件,它最初提供的最主要的功能就是:双系统切换和电源管理。 那么如何进行双系统切换呢,在双系统切换的示例中,除了CPU的跳转,例如CPU…

Ubuntu Updates for this repository will not be applied

1. 问题描述 在Ubuntu中使用apt update时提示如下错误信息。 Get:1 http://archive.ubuntu.com/ubuntu jammy InRelease [270 kB] Get:2 http://archive.ubuntu.com/ubuntu jammy-updates InRelease [119 kB] Get:3 http://archive.ubuntu.com/ubuntu jammy-backports InRele…

使用静态方法接受对象参数

我们先来看一个例子 public class MyInteger { private int value; // 构造函数 public MyInteger(int value) { this.value value; } // 实例方法 public boolean isEven() { return value % 2 0; } // 静态方法接受int参数 public static boolean isEvenStatic…

leetcode打卡#day44 1049. 最后一块石头的重量 II、494. 目标和、474. 一和零

1049. 最后一块石头的重量 II class Solution { public:int lastStoneWeightII(vector<int>& stones) {vector<int> dp(1501, 0);int sum 0;for (int i 0; i < stones.size(); i) {sum stones[i];}int target sum / 2;for (int i 0; i < stones.si…

动态功能连接评估方法的变异性

摘要 背景&#xff1a;动态功能连接(dFC)已成为理解大脑功能的一种重要测量指标。虽然已经开发了各种各样的方法来评估dFC&#xff0c;但目前尚不清楚方法的选择会如何影响结果。在这里&#xff0c;本研究旨在考察常用dFC方法的结果变异性。 方法&#xff1a;本研究在Python中…

IT人的拖延——拖是因为不想离开“舒适区”?

人都是求“稳”的,在一个区域内呆了很久,也很舒适了,如果冒险离开进入未知的区域,万一结果不好怎么办?万一自己不适合怎么办?万一这个区域有着自己难以忍受的东西怎么办?这些对未知区域的恐惧感让我们在面对应该要做的事情时,不自觉地又拖延了起来。比如,我们在面临需…

【TF-IDF|1】深入解析TF-IDF算法—基础介绍

TF-IDF&#xff08;Term Frequency-Inverse Document Frequency&#xff09;是一种用于文本挖掘和信息检索的加权技术&#xff0c;用来评估一个词语对于一个文档集或一个语料库的重要程度。下面我们将从理论到实践&#xff0c;逐步解析TF-IDF算法&#xff0c;并编写一个简单的实…

阻塞IO、非阻塞IO、IO复用的区别 ?(非常详细)零基础入门到精通,收藏这一篇就够了

前言 在《Unix网络编程》一书中提到了五种IO模型&#xff0c;分别是&#xff1a;阻塞IO、非阻塞IO、IO复用、信号驱动IO以及异步IO。本篇文章主要介绍IO的基本概念以及阻塞IO、非阻塞IO、IO复用三种模型&#xff0c;供大家参考学习。 一、什么是IO 计算机视角理解IO: 对于计…

const与static区别

const与static的主要区别在于它们修饰的对象的行为和属性。 const 用于声明一个值不能被修改的常量。它主要用于定义常量、修饰指针、函数的输入参数和返回值&#xff0c;以确保这些值在程序运行期间保持不变。const修饰的变量或对象具有不可变性&#xff0c;这有助于提高程序的…

算法练习(一)——数学公式,逻辑思维,DFS递归

算法练习 题目一题干解法代码解释 Tips 题目二题干解法代码解释 Tips 题目三题干解法代码解释 Tips 题目一 题干 给定一个数a&#xff0c;这个a是可以由一组m个连续的正整数相加得到的&#xff0c;求这个m的最小值。举例&#xff1a;a211234561011&#xff0c;会发现10和11是…

VD1011 单节锂离子充电电池保护 2.8V过放保护 SOT-23小封装芯片

VD1011&#xff0c;内置高精度电压检测电路和延迟电路以及内置MOSFET&#xff0c;是用于单节锂离子/锂聚合物可再充电 电池的保护IC。 本IC适合干对1节锂离子/锂聚合物可再充电电池的过充电、过放电和过电流进行保护。 VD1011具备如下特点 高精度电压检测电路 过充电检测电压 …

JDK8-17新特性

一、JDK8新特性:Lambda表达式 1.Lambda表达式及其使用举例 Lambda是一个匿名函数&#xff0c;我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。使用它可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格&#xff0c;使Java的语言表达能力…

类加载的验证阶段你不知道的东西

一、验证是链接阶段&#xff08;验证&#xff0c;准备&#xff0c;解析&#xff09;的第一步&#xff0c;是验证.class文件中的二进制字节流被转换成的Java虚拟机里的Class对象是否合法的步骤。主要作用就是确保被加载的类的正确性、安全性及符合Java虚拟机规范&#xff0c;确保…

nc网络收发测试-tcp客户端\TCP服务器\UDP\UDP广播

netcat&#xff08;nc&#xff09;&#xff1a; 作用&#xff1a;一个功能强大的网络工具&#xff0c;提供了简单的网络测试和网络编程功能。工作原理&#xff1a;可以用于建立TCP或UDP连接&#xff0c;并发送和接收数据。示例用法&#xff1a; 监听TCP端口&#xff1a;nc -l 1…

OO U4 博客

文章目录 正向建模与开发单元架构设计与追踪关系单元架构设计追踪关系 架构设计思维进化测试思维演进课程收获 正向建模与开发 在本单元中&#xff0c;我学习了UML这一建模工具。UML具备相当多种类的图&#xff0c;通过先设计UML图再进行开发&#xff0c;能够避免架构的重大调…

django学习入门系列之第二点《浏览器能识别的标签4》

文章目录 input类型下拉框多行文本往期回顾 input类型 1&#xff1a;打出后可以在里面编写内容 <!-- 自闭合标签 --> <!-- 默认行内标签 --> <input type"text">placeholder 显示背景 <input type"text" id"txtUser" p…