92

Learning React from the docs and came across this example:

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

According to Mozilla, super allows you to use this in the constructor. Is there any other reason to use a standalone super (I know super allows you to access parent class's methods as well) but with React is there any other use case of just calling super() by itself?

nCardot
  • 5,992
  • 6
  • 47
  • 83
stackjlei
  • 9,485
  • 18
  • 65
  • 113

7 Answers7

151

super() will call the constructor of its parent class. This is required when you need to access some variables from the parent class.

In React, when you call super with props, React will make props available across the component through this.props. See example 2 below

without super()

class A {
  constructor() {
    this.a = 'hello'
  }
}

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

console.log(new B())

with super()

class A {
  constructor(props) {
    this.props = props
  }
}

class B extends A {
  constructor(props) {
    super(props)
    console.log(this.props)
  }
}

console.log(new B({title: 'hello world'}))
starball
  • 20,030
  • 7
  • 43
  • 238
Pranesh Ravi
  • 18,642
  • 9
  • 46
  • 70
  • 15
    +1 much more clear explanation than the accepted answer. You could make your answer shorter and more to the point too. – a20 Dec 12 '17 at 07:02
  • thanks for your answer, so it is a different behavior than the prototype chain that will dive down to fetch a prototype function in some way – Webwoman May 26 '19 at 13:37
  • Why did you remove the string in A in the super example? https://jsfiddle.net/vbuoc378/1/ – Ian Smith Oct 13 '19 at 16:14
  • I have an intuition as if this is not necessary. But it is, if not it is just making a huge assumption (passing props implicitly into the parent class, effectively assuming that it will be the same). Thanks for this answer very clarifying. +1 – Mario Matos Oct 21 '20 at 00:28
118

super() is called inside a react component only if it has a constructor. For example, the below code doesn't require super:

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

However if we have a constructor then super() is mandatory:

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

    }
}

The reason why this cannot be allowed before super() is because this is uninitialized if super() is not called. However even if we are not using this we need a super() inside a constructor because ES6 class constructors MUST call super if they are subclasses. Thus, you have to call super() as long as you have a constructor. (But a subclass does not have to have a constructor.)

We call super(props) inside the constructor if we have to use this.props, for example:

class App extends React.component{
    constructor(props){
        super(props);
        console.log(this.props); // prints out whatever is inside props

    }
}

I hope I could make it clear.

nCardot
  • 5,992
  • 6
  • 47
  • 83
Shubham Khatri
  • 270,417
  • 55
  • 406
  • 400
  • 1
    so is the main purpose of having a constructor inside a component is to take some action immediately after the initialization of the component? super will then allow you 1.) access to `this` and 2.) if it takes props as a parameter, access to its parents props? – stackjlei Nov 08 '16 at 20:28
  • does super allow you to access the parent component's props? – stackjlei Nov 08 '16 at 20:29
  • You won't be able to access parent components props with super – Shubham Khatri Nov 09 '16 at 03:30
  • Why doesn't it just call super() by default if it's a subclass? Makes no sense. Unnecessary line. – Philip Rego May 23 '20 at 18:34
4

Worth adding that super() is short for superclass contructor, a concept from inheritance.

By default the class Square inherits the constructor from its superclass React.Component.

The inherited constructor can be overridden by declaring a new constructor() method.

If the intention is to extend rather than override the superclass constructor then it must be explicitly invoked using super().

rnbrady
  • 204
  • 1
  • 6
2

When implementing the constructor for a React.Component subclass, you should call super(props) before any other statement. Otherwise, this.props will be undefined in the constructor, which can lead to bugs.

sg28
  • 1,363
  • 9
  • 19
1

In JavaScript, super refers to the parent class constructor.

Importantly, you can’t use this in a constructor until after you’ve called the parent constructor. JavaScript won’t let you: But we forgot that if a function is called before the super() call had a chance to set up this.name. So this.name isn’t even defined yet! As you can see, code like this can be very difficult to think about. To avoid such pitfalls, JavaScript enforces that if you want to use this in a constructor, you have to call super first. Let the parent do its thing! And this limitation applies to React components defined as classes too:

gaya3_96
  • 19
  • 1
0

super(); is not required by react, but is mandated by ES6 subclass

Raviprajna
  • 31
  • 2
-1

To use this keyword we should use the super keyword before it. Why? super is used to call the parent class's constructor.

Now why do we need to call the parent's constructor? The answer is to initialize the properties values which we are referring through this keyword.

YakovL
  • 7,557
  • 12
  • 62
  • 102
Naveen Raju
  • 5,411
  • 1
  • 9
  • 9