There are situations where super() must be invoked and situations where super() cannot be invoked.

The basic rule is: a constructor in a non-derived class cannot invoke super(); a constructor in a derived class must invoke super().

Furthermore:

- super() must be invoked before the this and super keywords can be used.

- super() must be invoked with the same number of arguments as the base class' constructor.

- super() can only be invoked in a constructor - not in any other method.

- super() cannot be invoked multiple times in the same constructor.

Known Limitations

Noncompliant Code Example

class Animal {
  constructor() {
    super();         // Noncompliant, super() cannot be invoked in a base class
  }

  doSomething() {
  }
}

class Dog extends Animal {
  constructor(name) {
    this.name = name;
    super.doSomething();
    super();         // Noncompliant, super() must be invoked before "this" or "super" is used
  }

  doSomething() {
    super();         // Noncompliant, super() cannot be invoked outside of a constructor
  }
}

class Labrador extends Dog {
  constructor(name) {
    super();         // Noncompliant, super() must be invoked with one argument
  }
}

class GermanShepherd extends Dog {
  constructor(name) {
  }                  // Noncompliant, super() must be invoked in constructor of derived class
}

class FilaBrasileiro extends Dog {
  constructor(name) {
    super(name);
    super(name);    // Noncompliant, super() can only be invoked once
  }
}

Compliant Solution

class Animal {
  constructor() {
  }

  doSomething() {
  }
}

class Dog extends Animal {
  constructor(name) {
    super();
    this.name = name;
    super.doSomething();
  }

  doSomething() {
  }
}

class Labrador extends Dog {
  constructor(name) {
    super(name);
  }
}

class GermanShepherd extends Dog {
  constructor(name) {
    super(name);
  }
}

class FilaBrasileiro extends Dog {
  constructor(name) {
    super(name);
  }
}