react 类组件的super()与super(props)

1、super() :

	(1)在calss中继承是通过extends关键字来实现的。子类必须在constructor()中调用super()方法,否则新建实例时会报错
	(2)报错原因,是因为子类是没有自己的this对象的,它只能继承父类的this对象,然后对其进行加工,而super就是将父类中的this对象继承给子类,没有super,子类就得不到this对象

2、ES5与ES6关于继承的实现不同之处

(1)new操作符:

(1)首先生成一个空对象obj,并将其作为this
(2)将空对象的__proto__指向构造函数的prototype
(3)利用函数的call方法,将原本指向window的绑定对象this指向了obj(这样一来,当我们向函数中再传递实参时,对象的属性就会被挂载到obj)
(4)利用函数返回对象obj

(2)ES6与ES5关于继承

在ES5的继承中,先创建子类对象this,然后再将父类的方法添加到this上(Parten.apply(this))
在ES6的继承中,先创建父类的实例this(所以要调用super()方法,将父类的this对象继承给子类),之后,再用子类的构造函数修改this

3、super(props)------super()-----以及不写super的区别

如果你用到了constructor就必须写super(),是用来初始化this的,可以绑定事件到this上;
如果你在constructor中要使用this.props,就必须给super加参数:super(props);
(无论有没有constructor,在render中this.props都是可以使用的,这是React自动附带的;)
 如果没用到constructor,是可以不写的;React会默认添加一个空的constructor。
Class A extends React.Component {
	//constructor是原型对象指向其构造函数的一个属性
	//且也是ES6对类的默认方法,通过new命令生成对象实例时自动调用该方法,并且该方法是类中必须有的
	//如果没有显示定义,则会默认添加空的constructor()
	constructor(props) {
		//如果不定义下面的this.props,仅有this.state,那就不用super(props),只用super()
		super(props) //用来将父类中this继承给子类
		//this.props必须是一个对象,才能在它下面定义属性
		//constructor(props)中传入的参数props为对象
		//super(props)的作用就是在父类的构造函数中给props赋值一个对象this.props = props这样你就能在它下面定义你要用到的属性了,其他没有传参的直接赋值为undefuined
		//由于state下面没有属性,所以如果只是定义state就直接super()就行了
		this.props.s = 'hh'
		this.props.x = = 0
		this.state = {
			user:'hhh',
			age:'19'
		}
	}
}

4、super()用法

class A{
    constructor(n){
        console.log(n); //=>100;
        this.x = 100;
    }
    getX(){
        console.log(this.x);
    }
}

class B extends A{//=>extends 类似实现原型继承
    constructor(){
        super(100);//=>类似于call的继承:在这里super相当于把A的constructor给执行了,并且让方法中的this是B的实例,super当中传递的实参都是在给A的constructor传递。
        this.y = 200;
    }
    getY(){
        console.log(this.y);
    }
}

let f = new B();
f.getY() //100
f.getX() //100
 class A {
      constructor(name,color) {
      this.name = name;
      this.color = color;
    }
    // toString 是原型对象上的属性
    toString() {
      console.log('name:' + this.name + ',color:' + this.color);

    }
  }

 class B extends A{
  constructor() {
    super('cat','white');
  }
  toString() {
    console.log(super.toString());//除constructor直接调用外,还可以使用super.xxx()来调用父类上的某个原型方法
  }
 }

 var cat = new B()
 cat.toString();  //=>name:cat,color:white
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值