ūü•á Classes, Herencia en Built-in Types (tipos nativos)

En ES2015, los constructores que devuelven un objeto sustituyen impl√≠citamente el valor de this para cualquier invocador de super(…). Es necesario que el c√≥digo del constructor generado capture cualquier valor de retorno potencial de super(…) y lo sustituya por this.

Como resultado, una subclase de Error, Array y otros, puede no funcionar de forma adecuada. Esto se debe a que las funciones de constructor para Error, Array, utilizan new.target de ES6 para ajustar la cadena de prototipos; sin embargo, no hay forma de asegurar un valor para new.target cuando se invoca con un constructor de ES5. Otros compiladores de nivel inferior suelen tener la misma limitación por defecto.

Para una clase como la siguiente:

class MsgError extends Error {
  constructor(m: string) {
    super(m);
  }
  imprimirError() {
    console.log("Hola " + this.message);
  }
}

const a = new MsgError("Este es un nuevo error");
a.imprimirError(); // <- esto generara un error
a.imprimirError();
  ^
TypeError: a.imprimirError is not a function

las situaciones que se presentan son:

  • Los m√©todos al construir estas subclases pueden ser undefined.
  • El valor instanceof no funcionar√° entre instancia de subclases, de forma que new MsgError() instanceof MsgError retornar√° false.

Como recomendación, se puede ajustar manualmente el prototype después de invocar super(...).

class MsgError extends Error {
  constructor(m: string) {
    super(m);
    Object.setPrototypeOf(this, MsgError.prototype);
  }
  imprimirError() {
    console.log("Hola " + this.message);
  }
}

const a = new MsgError("Este es un nuevo error");
a.imprimirError();
Hola Este es un nuevo error

Los workarounds presentados no funcionan en navegadores como IE10 y previos.