为什么react的组件要super(props)

摘要:
我看到有人在segmentfault中提出了同样的问题,下面的SF给出了解释。在es6中实现继承时:classsup{constructor{this.name=name}printName(){console.log}}classsubextendssup}constructors{superthis.age=age}printAge()}console/log}letjack=newsubjack。printName()//输出:插孔。printAge()//输出:20对es5和es6可以在es5中找到继承,继承在es5实现。首先,需要调用函数的call方法来继承父类的属性,以通过new关键字继承父类原型的对象上的方法和属性。最后,您可以通过手动指定构造函数属性来指向子类对象,从而在es6中实现继承。您可以通过直接调用super来直接继承父类的属性和方法,因此super的功能相当于实现继承的上述步骤。然而,es6提供了超级语法糖来简化继承的实现

  对这个问题纠结了好几天,一直没时间深入研究。在segmentfault看到有人提出了同样的问题,下面这篇SF给出了解释。为什么react的组件要super(props)

解释一: 

  1. 调用super的原因:在ES6中,在子类的constructor中必须先调用super才能引用this

  2. super(props)的目的:在constructor中可以使用this.props

  3. 最后,可以看下React文档,里面有一段

Class components should always call the base constructor with props.

解释二: 

假设在es5要实现继承,首先定义一个父类:

//父类
function sup(name) {
    this.name = name
}
//定义父类原型上的方法
sup.prototype.printName = function (){
    console.log(this.name)
}

现在再定义他sup的子类,继承sup的属性和方法:

function sub(name,age){
    sup.call(this,name)    //调用call方法,继承sup超类属性
    this.age = age
}    

sub.prototype = new sup   //把子类sub的原型对象指向父类的实例化对象,这样即可以继承父类sup原型对象上的属性和方法
sub.prototype.constructor = sub    //这时会有个问题子类的constructor属性会指向sup,手动把constructor属性指向子类sub
//这时就可以在父类的基础上添加属性和方法了
sub.prototype.printAge = function (){
    console.log(this.age)
}

这时调用父类生成一个实例化对象:

    let jack = new sub('jack',20)
    jack.printName()    //输出 : jack
    jack.printAge()    //输出 : 20

这就是es5中实现继承的方法。而在es6中实现继承:

    class sup {
        constructor(name) {
            this.name = name
        }
    
        printName() {
            console.log(this.name)
        }
    }


class sub extends sup{
    constructor(name,age) {
        super(name)
        this.age = age
    }

    printAge() {
        console.log(this.age)
    }
}

let jack = new sub('jack',20)
    jack.printName()    //输出 : jack
    jack.printAge()    //输出 : 20

对比es5和es6可以发现在es5实现继承,在es5中实现继承:

  1. 首先得先调用函数的call方法把父类的属性给继承过来

  2. 通过new关键字继承父类原型的对象上的方法和属性

  3. 最后再通过手动指定constructor属性指向子类对象

而在es6中实现继承,直接调用super(name),就可以直接继承父类的属性和方法,所以super作用就相当于上述的实现继承的步骤,不过es6提供了super语法糖,简单化了继承的实现

免责声明:文章转载自《为什么react的组件要super(props)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇string中的CopyonWrite技术Phpcms V9 调用随机文章的方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

多屏适应响应式布局方案,响应式、自适应布局区别 完整的思维导图

多屏适应响应式布局方案,响应式、自适应布局区别 响应式布局 响应式布局是Ethan Marcotte在2010年5月份提出的一个概念,一个网站能够兼容多个终端,而不是为每个终端做一个特定的版本,不需要分配子域名。可以为不同终端的用户提供更加舒适的界面和更好的用户体验,而且随着目前大屏幕移动设备的普及,用大势所趋来形容也不为过。 响应式布局能够兼容不同屏幕...

基于React Native的58 APP开发实践

React Native在iOS界早就炒的火热了,随着2015年底Android端推出后,一套代码能运行于双平台上,真正拥有了Hybrid框架的所有优势。再加上Native的优秀性能,让越来越多的公司在实际项目中一探究竟。58同城APP发布模块年代久远,一直计划进行重构以适应日益苛刻的用户体验,这个需求与我们在React Native上一探究竟的意愿一碰撞...

react使用echarts地图实现中国地图大区展示

   日常项目中经常会用到百度地图或者echarts图标展示,今天给大家展示的是如何在react开发项目中使用百度echars的地图展示,把中国地图分为东北大区、华东大区、华南大区、华西大区、华中大区以及华北大区并用颜色标识方便识别。     最终展示效果如下:    我是直接用的react官方提供的create-react-app快速构建开发环境,之后就...

Taro开发微信小程序的初体验

了解Taro 听说Taro是从几个星期前开始的,在一次饭桌上,一个小伙伴说:“Hey, 你听说了Taro么,听说只需要写一套程序就可以生成H5,小程序以及RN的代码模板,并且类似于React的语法。”“哦?还有这么好的事,赶紧研究一下。” Taro初体验 去官网,Github了解了一下,Taro是由京东·凹凸实验室团队开发的,在掘金上看到他们的发稿,大致归...

react之传递数据的几种方式props传值、路由传值、状态提升、redux、context

react之传递数据的几种方式 1、父子传值 父传值:<子的标签 value={'aaa'} index={'bbb'}></子的标签> 子接值:<li key={this.props.index}>{this.props.value}</li>   不止可以传值也可以传递方法: 父:方法={this.方法...

【React】react学习笔记10-兄弟组件间的传值

上一篇博文简述了脚手架的使用,以及在ws中的简单配置,详细的配置方法就不讲了,可能有很多细节,在日常使用中发掘就好。然后是脚手架的项目结构以及之间的联系,这个完全可以自己找出来,再不济就百度一下就好。 今天记录一下组件之间的传值问题,特别是兄弟组件的传值,真的是为难了我好久的一个问题: 要做啥呢?: 方便兄弟组件中传值,我知道的实现方式有两种,一种是使用R...