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.