为什么 super() 要放在构造函数 contructor 最上面执行 ?

ES6 语法中,super 指代父类的构造函数,React 里面就是指代 React.Component 的构造函数。

在你调用 super() 之前,你无法在构造函数中使用 this,JS 不允许这么做。为什么要不允许呢?

看一下下面这个例子:

class Person {constructor(name) {this.name = name;}
}class PolitePerson extends Person {constructor(name) {this.greetColleagues(); //这是不允许的super(name);}greetColleagues() {alert('Good morning folks!');alert('My name is ' + this.name + ', nice to meet you!');}
}

如果允许的话,在 super() 之前执行了一个 greetColleagues 函数,greetColleagues 函数里用到了 this.name,这时还没执行 super(name),greetColleagues 函数里就获取不到 super 传入的 name 了,此时的 this.name 是 undefined。

super() 里为什么要传 props?

执行 super(props) 可以使基类 React.Component 初始化 this.props。

// React 内部
class Component {constructor(props) {this.props = props;// ...}
}

有时候我们不传 props,只执行 super(),或者没有设置 constructor 的情况下,依然可以在组件内使用 this.props,为什么呢?

其实 React 在组件实例化的时候,马上又给实例设置了一遍 props:

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

那是否意味着我们可以只写 super() 而不用 super(props) 呢?

不是的。虽然 React 会在组件实例化的时候设置一遍 props,但在 super 调用一直到构造函数结束之前,this.props 依然是未定义的。

class Button extends React.Component {constructor(props) {super(); // ? 我们忘了传入 propsconsole.log(props);      // ✅ {}console.log(this.props); // ? undefined}// ...
}

如果这时在构造函数中调用了函数,函数中有 this.props.xxx 这种写法,直接就报错了。

而用 super(props),则不会报错。

class Button extends React.Component {constructor(props) {super(props); // ✅ 我们传了 propsconsole.log(props);      // ✅ {}console.log(this.props); // ✅ {}}// ...
}

所以我们总是推荐使用 super(props) 的写法,即便这是非必要的。

参考:https://overreacted.io/why-do-we-write-super-props/

React构造函数中为什么要写 super(props)相关推荐

  1. super()和super(props)的区别以及为什么要写super(props)

    一般,我们在写自定义类组件的时候会写上构造函数如下: class Checkbox extends React.Component {constructor(props) {super(props); ...

  2. 【译】为什么要写super(props)

    译注: 原文地址 https://overreacted.io/why-do-we-write-super-props/ 正文 我听说Hooks是新的热点.好笑的是,我想通过描述一些关于class组件 ...

  3. 【译】为何我们要写super(props)?

    我听说现在Hooks是新的热点.讽刺地是,我想描述类的相关事实作为这片博客的开始.那是怎么样的呢? 这些坑对于有效地使用React并不重要.但如果你想更深入地了解事物的工作原理,你可能会发现它们很有趣 ...

  4. react组件中的constructor和super小知识

    1.react中用class申明的类一些小知识 如上图:类Child是通过class关键字申明,并且继承于类React. A.Child的类型是?   typeof  Child   ===  'fu ...

  5. 为什么super()和this()调用语句不能同时在一个构造函数中出现的解释

    我想这应该是Java构造函数的一种机制吧,首先以子类和父类为例. 当你创建一个子类的实例时,首先会调用父类的构造函数,然后再调用子类的构造函数,如果父类中没有缺省构造函数,则必须再子类的构造函数中显示 ...

  6. 为什么this()和super()必须是构造函数中的第一条语句?

    Java要求,如果您在构造函数中调用this()或super(),则它必须是第一条语句. 为什么? 例如: public class MyClass {public MyClass(int x) {} ...

  7. [转载] 为什么this()和super()必须是构造函数中的第一条语句?

    参考链接: Java中的构造函数链接(带示例) Java要求,如果您在构造函数中调用this()或super(),则它必须是第一条语句. 为什么? 例如: public class MyClass { ...

  8. java super构造函数_Java为什么this()和super()必须是构造函数中的第一条语句?...

    Java要求,如果你在构造函数中调用this()或super(),则它必须是第一条语句.为什么? 例如: public class MyClass { public MyClass(int x) {} ...

  9. [react] 在构造函数中调用super(props)的目的是什么?

    [react] 在构造函数中调用super(props)的目的是什么? 这是ES6的语法.class组件继承自React.Component,super(props)之后,有以下几个作用: 初始化pr ...

最新文章

  1. oracle count null 0,oracle count()函数对null值的处理
  2. 数组中一个属出现奇数次,其他数都出现偶数次.寻找出这个出现奇数次的数
  3. Matplotlib从文件绘图时Y轴坐标不正确
  4. python网站服务器好麻烦_python写的网站,云服务器经常无法访问
  5. go web框架_golang微服务框架go-micro 入门笔记2.2 micro工具之微应用利器micro web
  6. C语言头文件尖括号和双引号的区别
  7. 为什么大多数编程语言性能对比都有问题?
  8. 在nodejs项目装一个库的多个版本
  9. 深入浅出BP神经网络(反向传播算法)
  10. 基于Java的Office 系列文档处理五种工具简单介绍
  11. C#键盘钩子之局部钩子和全局钩子
  12. php对url转码,如何使用php url中文转码
  13. 淘宝的返利网怎么用_淘宝便宜的方法
  14. 【线性代数】行列式和矩阵的关系
  15. 【单片机】汇编指令入门学习|单片机启动代码汇编
  16. 解决win10英文操作系统安装软件中文乱码问题
  17. 2018开春大礼:750页电子书 + 33场技术沙龙资料 + 17场线上课程分享
  18. 推荐一款截屏翻译工具|截屏提取文字|划词翻译
  19. java实现大乐透彩票
  20. 陌上花开缓缓归(转)

热门文章

  1. QtMetaObjectsysmtem详解之三:QMetaObject接口实现
  2. jndi weblogic mysql_在WebLogic新建针对Oracle数据库的JNDI数据源
  3. 降维算法总结(超全!附代码)
  4. 万字长文详解 Go 程序是怎样跑起来的?| CSDN 博文精选
  5. 马尔科夫随机场Markov Random Field
  6. 实验10 人机交互的质量与测评
  7. 人机交互-2-交互设计的原则与方法
  8. 代码之外——醒世良言
  9. 4.0低功耗蓝牙解决方案
  10. 介孔二氧化硅纳米球 Mesoporous silica nanosphere 的介孔二氧化硅纳米球