在React构造函数中调用super()会做什么?

时间:2016-11-05 00:17:06

标签: javascript reactjs constructor ecmascript-6

docs学习反应并遇到了这个例子:

class Square extends React.Component {
  constructor() {
    super();
    this.state = {
      value: null,
    };
  }
  ...
}

根据Mozilla,super允许您在构造函数中使用this。是否有任何其他理由使用独立super(我知道super允许您访问父类的方法)但是使用React还有任何其他用例只需调用{ {1}}本身?

7 个答案:

答案 0 :(得分:69)

仅当反应组件具有构造函数时,才会在反应组件内调用

super()。例如,以下代码不需要super:

class App extends React.component {
    render(){
        return <div>Hello { this.props.world }</div>;
    }
}

但是,如果我们有一个构造函数,那么super()是必需的:

class App extends React.component {
    constructor(){
        console.log(this) //Error: 'this' is not allowed before super()

    }
}

this之前无法允许super()的原因是this如果未调用super()则未初始化this。但是,即使我们没有使用super(),我们也需要在构造函数中使用ES6 class constructors MUST call super if they are subclasses,因为super()。因此,只要您有构造函数,就必须调用super(props)。 (但是子类不必有构造函数)。

如果我们必须使用this.props,我们会在构造函数中调用class App extends React.component{ constructor(props){ super(props); console.log(this.props); // prints out whatever is inside props } } ,例如:

EditText

我希望我能说清楚。

答案 1 :(得分:65)

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool 将调用其super()课程的constructor。当您需要从父类访问某些变量时,这是必需的。

在React中,当您使用道具呼叫parent时。 React将通过super在整个组件中提供props。见下面的例子2

没有this.props

super()

class A { constructor() { this.a = 'hello' } } class B extends A { constructor(){ console.log(this.a) //throws an error } } console.log(new B())

super()

希望这有帮助!

答案 2 :(得分:1)

在 JavaScript 中,super 指的是父类构造函数。

重要的是,在调用父构造函数之前,您不能在构造函数中使用 this。 JavaScript 不会让你: 但是我们忘记了如果在 super() 调用有机会设置 this.name 之前调用了一个函数。所以 this.name 甚至还没有定义!如您所见,像这样的代码很难思考。 为了避免此类陷阱,JavaScript 强制要求如果您想在构造函数中使用 this,则必须首先调用 super。让父母做它的事!这个限制也适用于定义为类的 React 组件:

答案 3 :(得分:0)

在为React.Component subclass实现构造函数时,应在其他任何语句之前调用super(props)。否则,this.props将在构造函数中为undefined,这可能会导致错误。

答案 4 :(得分:0)

值得补充的是,super()是超类构造函数的缩写,是inheritance的概念。

默认情况下,类Square从其超类React.Component继承构造函数。

可以通过声明新的constructor()方法来覆盖继承的构造函数。

如果要扩展而不是覆盖超类构造函数,则必须使用super()显式调用它。

答案 5 :(得分:0)

super();不是必需的,而是由ES6子类强制的

答案 6 :(得分:-2)

要使用this关键字,我们应该使用前面的super关键字。为什么? super用于调用父类constructor

现在为什么我们需要打电话给父母constructor?答案是初始化我们通过this关键字引用的属性值。