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 quenew 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.