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
instanceofno funcionará entre instancia de subclases, de forma quenew MsgError() instanceof MsgErrorretornará 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.