This case works just fine:
class CustomError2015 extends Error {
constructor(message) {
super(message); // here the message is set correctly
console.log("Message: " + this.message);
}
}
throw new CustomError2015("ECMAScript 2015 class inheritance");
I expected that this one would work the same way, but it didn't:
function CustomError(message){
Error.call(this, message); // here the message IS NOT set
console.log("Message: " + this.message);
}
CustomError.prototype = Object.create(Error.prototype);
CustomError.prototype.constructor = CustomError;
throw new CustomError("CustomError function-like inheritance");
I'm wondering why? I there something wrong with my code or what?
Built in types (
Error,Array) are exotic, that means that their constructor is not normal, and the objects of their instance are not normal, they are special internal objects. Therefore this:does not work as
Errorhas to return an exotic object, whilethisis a regular object, and the engine can't convert one into the other. Therefore it returns a new exotic error (which you ignore in your code):The message gets set on that exotic object, and not on
this.That works in classes as
super(....)gets called before you can accessthis, and thereforethiscan be the exotic object, you cannot replicate that behaviour without classes.read on