Mettez à jour votre code pour affecter votre prototype au prototype Error.prototype et l'instanceof et vos assertions fonctionnent.
function NotImplementedError(message) {
this.name = "NotImplementedError";
this.message = (message || "");
}
NotImplementedError.prototype = Error.prototype;
Cependant, je voudrais simplement jeter votre propre objet et vérifier la propriété name.
throw {name : "NotImplementedError", message : "too lazy to implement"};
Modifier en fonction des commentaires
Après avoir regardé les commentaires et essayé de me rappeler pourquoi j'attribuerais un prototype à la Error.prototype
place de new Error()
Nicholas Zakas dans son article , j'ai créé un jsFiddle avec le code ci-dessous:
function NotImplementedError(message) {
this.name = "NotImplementedError";
this.message = (message || "");
}
NotImplementedError.prototype = Error.prototype;
function NotImplementedError2(message) {
this.message = (message || "");
}
NotImplementedError2.prototype = new Error();
try {
var e = new NotImplementedError("NotImplementedError message");
throw e;
} catch (ex1) {
console.log(ex1.stack);
console.log("ex1 instanceof NotImplementedError = " + (ex1 instanceof NotImplementedError));
console.log("ex1 instanceof Error = " + (ex1 instanceof Error));
console.log("ex1.name = " + ex1.name);
console.log("ex1.message = " + ex1.message);
}
try {
var e = new NotImplementedError2("NotImplementedError2 message");
throw e;
} catch (ex1) {
console.log(ex1.stack);
console.log("ex1 instanceof NotImplementedError2 = " + (ex1 instanceof NotImplementedError2));
console.log("ex1 instanceof Error = " + (ex1 instanceof Error));
console.log("ex1.name = " + ex1.name);
console.log("ex1.message = " + ex1.message);
}
La sortie de la console était la suivante.
undefined
ex1 instanceof NotImplementedError = true
ex1 instanceof Error = true
ex1.name = NotImplementedError
ex1.message = NotImplementedError message
Error
at window.onload (http://fiddle.jshell.net/MwMEJ/show/:29:34)
ex1 instanceof NotImplementedError2 = true
ex1 instanceof Error = true
ex1.name = Error
ex1.message = NotImplementedError2 message
Cela confirme que le "problème" que j'ai rencontré était la propriété de pile de l'erreur était le numéro de ligne où a new Error()
été créé, et non où throw e
s'est produit. Cependant, cela peut être mieux que d'avoir l'effet secondaire d'une NotImplementedError.prototype.name = "NotImplementedError"
ligne affectant l'objet Error.
Aussi, notez avec NotImplementedError2
, quand je ne définis pas .name
explicitement, c'est égal à "Erreur". Cependant, comme mentionné dans les commentaires, car cette version définit le prototype sur new Error()
, je pourrais définir NotImplementedError2.prototype.name = "NotImplementedError2"
et être OK.