一、ES6类

ES6中,通过extends关键字实现类的继承,方式如下:

class sup {constructor(name) {this.name = name}printName() {console.log(this.name)}
}class sub extends sup{constructor(name,age) {super(name) // super代表的事父类的构造函数this.age = age}printAge() {console.log(this.age)}
}let jack = new sub('jack',20)
jack.printName()    //输出 : jack
jack.printAge()    //输出 : 20

在上面的例子中,可以看到通过super关键字实现调用父类,super代替的是父类的构建函数,使用super(name)相当于调用sup.prototype.constructor.call(this,name)

如果在子类中不使用super,关键字,则会引发报错,如下:

报错的原因是 子类是没有自己的this对象的,它只能继承父类的this对象,然后对其进行加工

super()就是将父类中的this对象继承给子类的,没有super()子类就得不到this对象

如果先调用this,再初始化super(),同样是禁止的行为

class sub extends sup{constructor(name,age) {this.age = agesuper(name) // super代表的事父类的构造函数}
}

所以在子类constructor中,必须先调用super才能引用this

二、类组件

React中,类组件是基于es6的规范实现的,继承React.Component,因此如果用到constructor就必须写super()才初始化this

这时候,在调用super()的时候,我们一般都需要传入props作为参数,如果不传进去,React内部也会将其定义在组件实例中

// React 内部
const instance = new YourComponent(props);
instance.props = props;

所以无论有没有constructor,在renderthis.props都是可以使用的,这是React自动附带的,是可以不写的:

class HelloMessage extends React.Component{render (){return (<div>nice to meet you! {this.props.name}</div>);}
}

但是也不建议使用super()代替super(props)

因为在React会在类组件构造函数生成实例后再给this.props赋值,所以在不传递propssuper的情况下,调用this.propsundefined,如下情况:

class Button extends React.Component {constructor(props) {super(); // 没传入 propsconsole.log(props);      //  {}console.log(this.props); //  undefined// ...
}

而传入props的则都能正常访问,确保了 this.props 在构造函数执行完毕之前已被赋值,更符合逻辑,如下:

class Button extends React.Component {constructor(props) {super(props); // 没传入 propsconsole.log(props);      //  {}console.log(this.props); //  {}// ...
}

三、总结

React中,类组件基于ES6,所以在constructor中必须使用super

在调用super过程,无论是否传入propsReact内部都会将porps赋值给组件实例porps属性中

如果只调用了super(),那么this.propssuper()和构造函数结束之间仍是undefined

参考文献

  • https://overreacted.io/zh-hans/why-do-we-write-super-props/

  • https://segmentfault.com/q/1010000008340434

--The End--

系列正在更新:5/33

点击下方卡片解锁更多

创作不易,星标、点赞、在看 三连支持

面试官:super()和super(props)有什么区别?相关推荐

  1. nodejs express use 传值_再也不怕面试官问你express和koa的区别了

    前言 用了那么多年的express.js,终于有时间来深入学习express,然后顺便再和koa2的实现方式对比一下. 老实说,还没看express.js源码之前,一直觉得express.js还是很不 ...

  2. 面试官:react和vue有什么区别吗?

    前言 大家好呀,清明节这两天有没有出门踏青扫墓呢!!! 言归正传,这是作者面试系列的第二篇文章!!!!!!! react和vue是什么?有啥区别吗? 三大框架之二,大家应该都不会陌生,都有学习过或者开 ...

  3. 面试官 | Class.forName 和 ClassLoader 有什么区别?

    作者 | 纪莫 来源 | dwz.date/eUc 在 Java 中 Class.forName() 和 ClassLoader 都可以对类进行加载.ClassLoader 就是遵循双亲委派模型最终调 ...

  4. 面试官 | Oracle JDK 和 OpenJDK 有什么区别?

    作者 | petercao 来源 | urlify.cn/yAn6ru OpenJDK是Sun在2006年末把Java开源而形成的项目,这里的"开源"是通常意义上的源码开放形式,即 ...

  5. 面试官:深拷贝与浅拷贝有啥区别?

    文章目录 1.前言 2.基本类型的拷贝 3.引用类型的拷贝 3.1 关于引用类型的浅拷贝 3.2 关于引用类型的深拷贝 1.前言 首先,明确一点深拷贝和浅拷贝是针对对象属性为对象的,因为基本数据类型在 ...

  6. 面试官:int和Integer有什么区别?为什么要有包装类?

    作者 | 磊哥 来源 | Java面试真题解析(ID:aimianshi666) 转载请联系授权(微信ID:GG_Stone) 重要说明:本篇为博主<面试题精选-基础篇>系列中的一篇,查看 ...

  7. 面试官:你说说ReentrantLock和Synchronized区别!

    大家好!又和大家见面了.为了避免面试尴尬,今天同比较通俗语言和大家聊下ReentrantLock和Synchronized区别!另外:整理了一份Java面试宝典完整版PDF,已成文档 使用方式 Syn ...

  8. 面试官:你说说ReentrantLock和Synchronized区别

    目录 使用方式 实现方式 公平和非公平 可重入锁 可中断的 条件队列 总结 大家好!又和大家见面了.为了避免面试尴尬,今天同比较通俗语言和大家聊下ReentrantLock和Synchronized区 ...

  9. python怎么接收udp报文_面试官:说说UDP和TCP的区别及应用场景

    上一篇聊完一文彻底搞懂 TCP三次握手.四次挥手过程及原理 这次聊聊TCP和UDP的区别和场景 TCP/IP 中有两个具有代表性的传输层协议,分别是 TCP 和 UDP.来看看传输层位于OSI七层协议 ...

  10. 解决方案和项目的区别_(实习招聘)PwC面试官问Advisory和Consulting有什么区别,怎么答?...

    点击添加图片描述(最多60个字) Advisory VS Consulting 一直是困扰职场小白的两个单词 明明中文都翻译为"咨询" 为什么它们偏偏是两个不同的部门? 想进入咨询 ...

最新文章

  1. 全球及中国陶瓷承烧板行业发展态势及运营前景研究报告2021-2027年版
  2. java 重写paint_java笔记 重写paintComponent方法以实现jPanel加背景
  3. 2. linux的日志文件在哪个目录,位于/var/log目录下的20个Linux日志文件
  4. gl3520 gl3510_带有gl gl本机的跨平台地理空间可视化
  5. Java二维数组谷电,java二维数组遍历的2种代码
  6. 面试题24. 反转链表
  7. URLshorting网址短链接PHP源码 开源源码
  8. android屏幕共享实现方式,基于WebRtc在Android端实现屏幕共享
  9. react native 之setState
  10. Tomcat部署记事
  11. php如何去重,php二维数组如何去重?(代码示例)
  12. python获取文件列表失败_python – Pytesseract没有这样的文件或目录错误
  13. 迅捷word转换成pdf转换器 4.1 官方版
  14. matlab 排序 cell,MATLAB中对cell数组排序
  15. 用C语言递归实现火车调度算法详解
  16. 小技巧(8):Word中自定义目录,并设置自动目录的格式
  17. 在html5水平边距属性hspace,HTML5 常用语法一览(列举不支持的属性)
  18. 解决Linux下adb devices找不到设备
  19. 罗技G603鼠标欧姆龙D2FC-F-7N微动开关拆解修复双击问题要点解析
  20. 阿里云一个账号给多个主体备案

热门文章

  1. Windows 7下安装CentOS 7 Linux双操作系统
  2. [六点]Pygame零基础入门:极简开发框架
  3. pythonocc 用BRepOffsetAPI_ThruSections建3D棱台
  4. Photoshop 什么是位图?什么是矢量图?它们二者间有什么区别,不妨来看看
  5. 中国互联网创新的超级杀手!腾讯已成为国内中小型创新企业的终结者!讨论...
  6. 好物推荐 | 新一代一线通投影仪方案
  7. 柜位预测(二)——神经网络-FANN库
  8. 甄别集成灶品牌,对比集成灶排名,无边界青年这样构建无界厨房
  9. Dubbo之@Activate
  10. FileUpload1上传的文件类型_控制