chst365's blog chst365's blog
首页
  • Git
  • 网络
  • 操作系统
  • 浏览器
  • webpack
  • JavaScript
  • TypeScript
  • 性能
  • 工程化
  • React
  • 编程题
  • React技术揭秘
  • 算法
  • Node
  • 编码解码
  • NodeJS系列
  • Linux系列
  • JavaScript系列
  • HTTP系列
  • GIT系列
  • ES6系列
  • 设计模式系列
  • CSS系列
  • 小程序系列
  • 数据结构与算法系列
  • React系列
  • Vue3系列
  • Vue系列
  • TypeScript系列
  • Webpack系列
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

chst365

DIV工程师
首页
  • Git
  • 网络
  • 操作系统
  • 浏览器
  • webpack
  • JavaScript
  • TypeScript
  • 性能
  • 工程化
  • React
  • 编程题
  • React技术揭秘
  • 算法
  • Node
  • 编码解码
  • NodeJS系列
  • Linux系列
  • JavaScript系列
  • HTTP系列
  • GIT系列
  • ES6系列
  • 设计模式系列
  • CSS系列
  • 小程序系列
  • 数据结构与算法系列
  • React系列
  • Vue3系列
  • Vue系列
  • TypeScript系列
  • Webpack系列
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • NodeJS系列

  • Linux系列

  • JavaScript系列

  • HTTP系列

  • GIT系列

  • ES6系列

  • 设计模式系列

  • CSS系列

  • 小程序系列

  • 数据结构与算法系列

  • React系列

    • React中组件之间如何通信?
    • 说说React diff的原理是什么?
    • 说说你在React项目是如何捕获错误的?
    • 说说对受控组件和非受控组件的理解?应用场景?
    • 在react中组件间过渡动画如何实现?
    • 说说React服务端渲染怎么做?原理是什么?
    • 说说你在使用React 过程中遇到的常见问题?如何解决?
    • 说说对Fiber架构的理解?解决了什么问题?
    • 说说对React Hooks的理解?解决了什么问题?
    • React事件绑定的方式有哪些?区别?
    • 你在React项目中是如何使用Redux的? 项目结构是如何划分的?
    • React构建组件的方式有哪些?区别?
    • 说说对Redux中间件的理解?常用的中间件有哪些?实现原理?
    • state 和 props 有什么区别?
    • 说说 React中的setState执行机制
    • 说说React render方法的原理?在什么时候会被触发?
    • 说说你对Redux的理解?其工作原理?
    • 说说你对immutable的理解?如何应用在react项目中?
    • 说说 Real DOM 和 Virtual DOM 的区别?优缺点?
    • super() 和 super(props) 有什么区别?
      • 一、ES6 类
      • 二、类组件
      • 三、总结
      • 参考文献
    • 说说你是如何提高组件的渲染效率的?在React中如何避免不必要的render?
    • 说说对 React 的理解?有哪些特性?
    • 说说 React 性能优化的手段有哪些?
    • 说说对React refs 的理解?应用场景?
    • 说说你对React Router的理解?常用的Router组件有哪些?
    • 说说对高阶组件的理解?应用场景?
    • 说说 React 生命周期有哪些不同阶段?每个阶段对应的方法是?
    • 说说react中引入css的方式有哪几种?区别?
    • 说说React的事件机制?
    • 说说React Jsx转换成真实DOM过程?
    • React中的key有什么作用?
    • 说说React Router有几种模式?实现原理?
    • 说说对React中类组件和函数组件的理解?有什么区别?
  • Vue3系列

  • Vue系列

  • TypeScript系列

  • Webpack系列

  • 面试官
  • React系列
chst365
2023-06-28
目录

super() 和 super(props) 有什么区别?

# 面试官:super() 和 super(props) 有什么区别?

# 一、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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

在上面的例子中,可以看到通过 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 = age;
    super(name); // super代表的事父类的构造函数
  }
}
1
2
3
4
5
6

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

# 二、类组件

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

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

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

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

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

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

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

class Button extends React.Component {
  constructor(props) {
    super(); // 没传入 props
    console.log(props);      //  {}
    console.log(this.props); //  undefined
    // ...
  }
}
1
2
3
4
5
6
7
8

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

class Button extends React.Component {
  constructor(props) {
    super(props); // 没传入 props
    console.log(props);      //  {}
    console.log(this.props); //  {}
    // ...
  }
}
1
2
3
4
5
6
7
8

# 三、总结

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

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

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

# 参考文献

  • https://overreacted.io/zh-hans/why-do-we-write-super-props/ (opens new window)
  • https://segmentfault.com/q/1010000008340434 (opens new window)
#面试官
上次更新: 2025/04/11, 17:57:53
说说 Real DOM 和 Virtual DOM 的区别?优缺点?
说说你是如何提高组件的渲染效率的?在React中如何避免不必要的render?

← 说说 Real DOM 和 Virtual DOM 的区别?优缺点? 说说你是如何提高组件的渲染效率的?在React中如何避免不必要的render?→

最近更新
01
面试官
03-27
02
this&指针&作用域&闭包
03-27
03
前端
03-27
更多文章>
Theme by Vdoing | Copyright © 2019-2025 chst365 | 豫ICP备17031889号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式