1、constructor()
这是 ES6 对类的默认方法,通过 new 命令生成对象实例时自动调用该方法。并且,该方法是类中必须有的,如果没有显示定义,则会默认添加空的constructor( )方法。
2、super()
在 class 方法中,子类通过 extends 关键字来继承父类,就必须在 constructor( ) 方法中调用 super( ) 方法,否则新建实例时会报错。报错的原因是:子类是没有自己的 this 对象的,它只能继承自父类的 this 对象,然后对其进行加工,而 super( ) 就是将父类中的 this 对象继承给子类。没有 super,子类就得不到 this 对象。
3、出现上面情况的原因是,ES5 的继承机制与 ES6 完全不同。简单解释,就是在 ES5 的继承中,先创建子类的实例对象 this,然后再将父类的方法添加到 this 上( Parent.apply(this) )。而ES6采用的是先创建父类的实例 this(故要先调用 super( ) 方法),完后再用子类的构造函数修改 this。
4、当一个构造函数前加上 new 的时候,背地里来做了四件事:
(1)生成一个空的对象并将其作为 this;
(2)将空对象的 __proto__ 指向构造函数的 prototype;
(3)让构造函数里面的 this 指向这个空对象,并且调用该构造函数,给这个空对象添加属性和方法;
(4)返回这个新对象,所以构造函数里面不需要return(如果构造函数没有 return 或者 return 一个返回 this 值是基本类型,则返回 this;如果 return 一个引用类型,则返回这个引用类型)。
5、super(props)
(1)如果你用到了 constructor 就必须写 super(),是用来初始化 this,可以绑定事件到 this 上;
(2)如果你在 constructor 中要使用 this.props,就必须给 super 加参数:super(props);(无论有没有 constructor,在 render 中 this.props 都是可以使用的,这是React自动附带的)
6、为什么不能在 constructor 中直接使用 this.props
其实很简单,因为 this.props 必须要是一个对象,才能在它下面定义属性,而 constructor(props) 方法中 传入的参数 props 为对象,所以 super(props) 的作用就是在父类的构造函数中给 props 赋值一个对象 this.props = props 这样就能在它的下面定义你要用到的属性了,然而其他的由于没有传参就直接赋值为 undefind。