Complex class polymorphism and lazy-loaded components
I ended up side-stepping the issue entirely by extending the Complex class with ES5 prototype chaining instead of ES6 extends:

class Complex {
  constructor(real = 0, imag = 0, abs = Math.sqrt(real * real + imag * imag), arg = Math.atan2(imag, real)) {
    this.real = real;
    this.imag = imag;
    this.abs  = abs &gt;= 0 ? abs : -abs;
    this.arg  = arg ? -((-arg + (abs &gt;= 0 ? Math.PI : 0)) % (Math.PI * 2) - Math.PI) : abs &lt; 0 ? Math.PI : 0;
  }

  // ...
};

const Cartesian = Complex.Cartesian = function Cartesian(real = 0, imag = 0) {
  this.real = real;
  this.imag = imag;
};

Cartesian.prototype = Object.create(Complex.prototype, {
  constructor: {
    configurable: true,
    enumerable: false,
    value: Cartesian,
    writable: true,
  },
  abs: {
    configurable: true,
    enumerable: true,
    get() {
      const value = Math.sqrt(this.real * this.real + this.imag * this.imag);

      Object.defineProperty(this, 'abs', {
        configurable: true,
        enumerable: true,
        value,
        writable: true
      });

      return value;
    },
    set(value) {
      Object.defineProperty(this, 'abs', {
        configurable: true,
        enumerable: true,
        value,
        writable: true,
      });

      return value;
    },
  },
  arg: {
    configurable: true,
    enumerable: true,
    get() {
      const arg = Math.atan2(this.imag, this.real);
      const value = arg ? -((-arg + Math.PI) % (Math.PI * 2) - Math.PI) : 0;

      Object.defineProperty(this, 'arg', {
        configurable: true,
        enumerable: true,
        value,
        writable: true,
      });

      return value;
    },
    set(value) {
      Object.defineProperty(this, 'arg', {
        configurable: true,
        enumerable: true,
        value,
        writable: true,
      });

      return value;
    },
  },
});

const Polar = Complex.Polar = function Polar(abs = 0, arg = 0) {
  this.abs = abs &gt;= 0 ? abs : -abs;
  this.arg = arg ? -((-arg + (abs &gt;= 0 ? Math.PI : 0)) % (Math.PI * 2) - Math.PI) : abs &lt; 0 ? Math.PI : 0;
};

Polar.prototype = Object.create(Complex.prototype, {
  constructor: {
    configurable: true,
    enumerable: false,
    value: Polar,
    writable: true,
  },
  real: {
    configurable: true,
    enumerable: true,
    get() {
      const value = this.abs * Math.cos(this.arg);

      Object.defineProperty(this, 'real', {
        configurable: true,
        enumerable: true,
        value,
        writable: true,
      });

      return value;
    },
    set(value) {
      Object.defineProperty(this, 'real', {
        configurable: true,
        enumerable: true,
        value,
        writable: true,
      });

      return value;
    },
  },
  imag: {
    configurable: true,
    enumerable: true,
    get() {
      const value = this.abs * Math.sin(this.arg);

      Object.defineProperty(this, 'imag', {
        configurable: true,
        enumerable: true,
        value,
        writable: true,
      });

      return value;
    },
    set(value) {
      Object.defineProperty(this, 'imag', {
        configurable: true,
        enumerable: true,
        value,
        writable: true,
      });

      return value;
    },
  },
});


This allowed me to write the constructors without requiring the call to super(), which was what created the issue in the first place.