Vererbung vom Error-Objekt - wo ist die Message-Eigenschaft?
Bemerkte ich ein seltsames Verhalten beim definieren von benutzerdefinierten Fehler-Objekte in Javascript:
function MyError(msg) {
Error.call(this, msg);
this.name = "MyError";
}
MyError.prototype.__proto__ = Error.prototype;
var error = new Error("message");
error.message; //"message"
var myError = new MyError("message");
myError instanceof Error; //true
myError.message; //"" !
Warum new Error("message")
legen Sie die message
Eigenschaft, während Error.call(this, msg);
nicht? Sicher, ich kann nur definieren this.message = msg
im MyError
Konstruktor, aber ich verstehe nicht ganz, warum dies nicht bereits in den ersten Platz.
InformationsquelleAutor der Frage Philippe Plantier | 2012-01-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
A. Wie, Raynos sagte, Der Grund
message
nicht festgelegt ist, dassError
ist eine Funktion zurückgibt, die ein neues Error-Objekt und wird nicht manipulierenthis
in keiner Weise.B. Die Art und Weise zu tun, dieses Recht zu setzen, ist das Ergebnis der Anwendung der Konstruktor auf
this
sowie Einstellung der Prototyp in der üblichen komplizierten javascripty Weg:Nur Probleme mit diesem Weg, es zu tun an diesem Punkt (ich habe iteratted es ein bisschen), dass
stack
undmessage
nicht enthalten sind inMyError
, undDas erste problem konnte behoben werden, indem die Iteration durch alle nicht-zählbare Eigenschaften der Fehler mit dem trick in diesem Antwort: Ist es möglich, dass die non-enumerable-Eigenschaft geerbt Namen eines Objektes?, aber das ist nicht unterstützt von ie<9. Das zweite problem könnte gelöst werden, indem die reißen aus dieser Zeile in den stack trace, aber ich bin mir nicht sicher, wie Sie sicher, dass (vielleicht nur das entfernen der zweiten Zeile von e sind.stack.toString() ??).
Update
Erstellte ich eine erbschaft Bibliothek, der dies tut ^ https://github.com/fresheneesz/proto
InformationsquelleAutor der Antwort B T
Error
nicht manipulierenthis
es erstellt ein neues error-Objekt, das zurückgegeben wird. Das ist, warumError("foo")
funktioniert auch ohne dienew
Stichwort.Hinweis: dies ist die Umsetzung spezifischer, v8 (chrome & node.js) Verhalten sich wie diese.
Auch
MyError.prototype.__proto__ = Error.prototype;
ist eine schlechte Praxis. VerwendenInformationsquelleAutor der Antwort Raynos
In Node.js Sie können erstellen Sie eine benutzerdefinierte Fehlermeldung wie diese:
Sehen captureStackTrace in Knoten docs
InformationsquelleAutor der Antwort Peter Dotchev
Können Sie Fehler.captureStackTrace für das filtern nicht benötigte Zeile in den stack-trace.
InformationsquelleAutor der Antwort Karen Grigoryan
Einen anderen Ansatz, um dieses ist, um das neue error-Instanz der Prototyp
this
, und so dass Sie nicht haben, um zu wissen, welche Eigenschaften zu kopieren, die bekommt um die Probleme B T darüber gesprochen, am Ende Ihrer Antwort.Und für mein Geld, es ist ein bisschen ordentlicher. Aber beachten Sie, dass
- Objekt.setPrototypeOf()
(oderobject.__proto__ =
auf nicht ES6-konforme Implementierungen, die es unterstützen) kann sehr langsam sein, also, wenn Sie diesen Fehler auf Ihrem Goldenen Pfade dann können Sie nicht wollen, dies zu tun.InformationsquelleAutor der Antwort daphtdazz
Ich mag eine Menge zu machen wiederverwendbar .js Dateien, die ich in fast jedem Projekt an dem ich teilnehmen. Wenn ich Zeit habe wird es ein Modul.
Für meine Fehler, die ich erstellen Sie eine
exceptions.js
Datei und fügen Sie es auf meine Dateien.Hier ist der Beispiel code in dieser Datei:
In den anderen Dateien, die von meiner Projekt ich muss dieses verlangen Zeile am Anfang der Datei.
Dieser Fehler brauchen Sie nur diese.
Beispiel für eine vollständige Implementierung
InformationsquelleAutor der Antwort João Miguel