Cập nhật mã của bạn để gán nguyên mẫu của bạn cho Error.prototype và thể hiện và các xác nhận của bạn hoạt động.
function NotImplementedError(message) {
this.name = "NotImplementedError";
this.message = (message || "");
}
NotImplementedError.prototype = Error.prototype;
Tuy nhiên, tôi sẽ chỉ ném đối tượng của riêng bạn và chỉ kiểm tra thuộc tính tên.
throw {name : "NotImplementedError", message : "too lazy to implement"};
Chỉnh sửa dựa trên ý kiến
Sau khi xem các bình luận và cố gắng nhớ tại sao tôi lại gán nguyên mẫu Error.prototype
thay vì new Error()
như Nicholas Zakas đã làm trong bài viết của mình , tôi đã tạo ra một jsFiddle với mã dưới đây:
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);
}
Đầu ra giao diện điều khiển là thế này.
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
Điều này xác nhận "vấn đề" mà tôi gặp phải là thuộc tính ngăn xếp của lỗi là số dòng new Error()
được tạo và không phải là nơi throw e
xảy ra. Tuy nhiên, điều đó có thể tốt hơn khi có tác dụng phụ của một NotImplementedError.prototype.name = "NotImplementedError"
dòng ảnh hưởng đến đối tượng Lỗi.
Ngoài ra, lưu ý với NotImplementedError2
, khi tôi không đặt .name
rõ ràng, nó bằng "Lỗi". Tuy nhiên, như đã đề cập trong các bình luận, vì phiên bản đó đặt nguyên mẫu new Error()
, tôi có thể đặt NotImplementedError2.prototype.name = "NotImplementedError2"
và ổn.