Zaktualizuj kod, aby przypisać prototyp do Error.prototype, a instanceof i twoje twierdzenia działają.
function NotImplementedError(message) {
this.name = "NotImplementedError";
this.message = (message || "");
}
NotImplementedError.prototype = Error.prototype;
Jednak po prostu rzuciłbym własny obiekt i po prostu sprawdziłbym właściwość name.
throw {name : "NotImplementedError", message : "too lazy to implement"};
Edytuj na podstawie komentarzy
Po zapoznaniu się z komentarzami i próbie przypomnienia sobie, dlaczego przypisałem prototyp do Error.prototype
zamiast new Error()
Nicholasa Zakasa w jego artykule , stworzyłem jsFiddle z poniższym kodem:
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);
}
Dane wyjściowe konsoli były takie.
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
Potwierdza to, że „problem”, na jaki natrafiłem, był właściwością stosu błędu był numer wiersza, w którym new Error()
został utworzony, a nie throw e
miejsce wystąpienia. Może to jednak być lepsze niż efekt uboczny NotImplementedError.prototype.name = "NotImplementedError"
linii wpływającej na obiekt Error.
Zauważ też NotImplementedError2
, że gdy nie ustawiam .name
jawnie, jest to równe „Błąd”. Jednak, jak wspomniano w komentarzach, ponieważ ta wersja ustawia prototyp na new Error()
, mógłbym ustawić NotImplementedError2.prototype.name = "NotImplementedError2"
i być OK.