箭头函数为什么不能当做构造函数

定义:

构造函数:

专门用来生成实例对象的函数(本质还是一个函数)

箭头函数:

ES6的一种新语法,允许使用 “=>” 定义函数

例如:

let func = (a,b) =>{return a + b;
}
func(1,2);
可简写为
let func = (a,b) => a + b;

那么,普通函数和箭头函数有什么区别呢

最大的区别在于this的指向问题(严格来说,其实箭头函数没有自己的this)

一、

1、普通函数的this,是谁调用这个函数,这个函数的this就指向谁
2、箭头函数没有this,this始终沿着作用域链向上找(定义时决定,而不是执行时决定)

二、

箭头函数没有绑定arguments对象,可以使用rest代替

function A(a) {console.log(arguments);// [1, 2, 3, 4, 5, callee: ƒ, Symbol(Symbol.iterator): ƒ]}
A(1, 2, 3, 4, 5);let B = (b) => {console.log(arguments);// Uncaught ReferenceError: arguments is not defined
}
B(1, 2, 3, 4, 5);let C = (...c) => {console.log(c);// [1, 2, 3, 4, 5]}
C(1, 2, 3, 4, 5);


三、

不能执行yield语句,不能作为generator函数

四、

箭头函数没有原型

var a = ()=>{return 1;
}
function b(){return 2;
}
console.log(a.prototype);  // undefined
console.log(b.prototype);   // {constructor: ƒ}

五、

箭头函数不能通过call()或apply改变this指向

var obj1 = {w:10}
var w = 69;
let f = ()=>{console.log(this.w)}
f();
f.call(obj1);

解释——箭头函数为什么不能当做构造函数:

一句话解释:

因为箭头函数没有 [ [Construct] ] 方法
和ES6的类的概念有点像,如果一个类没有定义constructor,直接new也会报错

进一步解释:

  1. 没有caller,就无法确定上下文
  2. 没有arguments
  3. 没有prototype

下面模拟一下new的过程:

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

可见缺少三个中的一个都不行,而刚好箭头函数都没有

箭头函数为什么不能当做构造函数相关推荐

  1. ES6精解:箭头函数

    基本用法 在ES6中允许使用 => 来定义函数,如下: var f = a => a;console.log(f(1)); //1 就等同于 var f = function(a){ret ...

  2. java 箭头函数_箭头函数丶Java教程网-IT开发者们的技术天堂

    基本用法 在ES6中允许使用 => 来定义函数,如下: var f = a => a; console.log(f(1)); //1 就等同于 var f = function(a){ r ...

  3. 箭头函数和普通函数有什么区别?

    箭头函数和普通函数有什么区别? 1:写法不一样 2:普通函数存在变量提升的现象 3:箭头函数不能作为构造函数使用 4:两者this的指向不同 5:箭头函数的arguments指向它的父级函数所在作用域 ...

  4. 箭头函数,匿名函数,为什么用?怎么用?有什么不一样?使用场景是什么?

    箭头函数的使用和一些特性 JS中的箭头函数用=>来标识.箭头函数有两个主要的优点: 更简短的函数: 更直观的作用域和this的绑定(不绑定this) 因为这些优点,箭头函数比起其他形式的函数声明 ...

  5. js map 箭头_JS异常函数之箭头函数

    来源:logrocket作者:Maciej Cieślar 译者:前端小智 为了保证的可读性,本文采用意译而非直译. 在JS中,箭头函数可以像普通函数一样以多种方式使用.但是,它们一般用于需要匿名函数 ...

  6. js map 箭头_JS异常函数之-箭头函数

    来源:logrocket 作者:Maciej Cieślar 译者:前端小智 为了保证的可读性,本文采用意译而非直译. 在JS中,箭头函数可以像普通函数一样以多种方式使用.但是,它们一般用于需要匿名函 ...

  7. ES5-拓展 箭头函数的this、this的优先级

    让内部函数的this指向和父函数的this,可以显示改变this指向,也可以使用箭头函数 箭头代替了function关键字 箭头函数内部没有this指向,箭头函数的this是稳定引用父作用域的.因为它 ...

  8. 深入理解this机制系列第三篇——箭头函数

    前面的话 this机制与函数调用有关,而作用域则与函数定义有关.有没有什么是可以将this机制和作用域联系起来的呢?本文将介绍ES6新增的内容--箭头函数 痛点 对于闭包的痛点在于,闭包的this默认 ...

  9. 箭头函数:this的指向问题

    关于typescript中函数的定义,有提到过它的定义方式(详见:函数的定义及特性),当时提到typescript中的'=>'不是ES6中的箭头函数的意思.什么是ES6的箭头函数?代码如下: v ...

最新文章

  1. CRM 客户端程序开发:获取表单界面上各种字段的值及其他属性
  2. 介绍一款比Android原生模拟器还要快的模拟器Genymotion(转)
  3. 构建dubbo分布式平台-maven构建ant-framework框架的pom.xml文件配置
  4. python字符串库函数_Python标准库概览(1):string
  5. react jquery_2019年React简介(面向仅了解jQuery的人们)
  6. stm32f103振镜_激光打标机运动控制器的设计与实现
  7. 【纯干货】4年前想解决的事情,今天才实验成功
  8. [Flash开发笔记] Flash 执行exe文件
  9. WINDOWS常用端口列表
  10. C语言头文件的作用和声明
  11. digester_Apache Digester示例–轻松配置
  12. 微信小程序实现图片虚化(滤镜)效果
  13. 千兆宽带网接入电脑电脑却只有百兆
  14. (一)数据分析——企业的贤内助(数据分析的价值)
  15. android9.0设置默认输入法
  16. Ubuntu忘记超级用户root密码,重新设置密码
  17. python 倒数两列_相机标定之张正友标定法数学原理详解(含python源码)
  18. 再谈中断机制(APIC)
  19. Java Web之JSP技术
  20. 毕业设计 单片机智能录音器设计与实现 - 物联网 嵌入式

热门文章

  1. 2022跨境出海:拉美电商市场现状及发展前景
  2. Android绘图最终篇之大战贝塞尔三次曲线
  3. python 遍历_python实现图广度优先遍历、深度优先遍历
  4. Oracle数据库版本跟jdk,oracle的jdbc的版本与jdk对应关系
  5. shell获取自身pid
  6. java与数据库综合实训_JAVA数据库学生管理系统实训报告
  7. 7/8~馈线接头的制作
  8. C#不同窗体之间传递参数
  9. 揭秘字节跳动埋点数据实时动态处理引擎(附源码)
  10. CodePush 热更新之自定义更新弹框及下载进度