gpt4 book ai didi

javascript - 从 Error 对象继承 - message 属性在哪里?

转载 作者:IT王子 更新时间:2023-10-29 03:16:51 26 4
gpt4 key购买 nike

我在 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; // "" !

为什么 new Error("message") 设置了 message 属性,而 Error.call(this, msg); 没有?当然,我可以在 MyError 构造函数中定义 this.message = msg,但我不太明白为什么它一开始就没有设置。

最佳答案

一个。就像 Raynos 说的那样,message 没有被设置的原因是 Error 是一个函数,它返回一个新的 Error 对象并且操作this 以任何方式。

B.正确执行此操作的方法是在 this 上设置构造函数的应用结果,以及以通常复杂的 javascripty 方式设置原型(prototype):

function MyError() {
var tmp = Error.apply(this, arguments)
tmp.name = this.name = 'MyError'

this.message = tmp.message
// instead of this.stack = ..., a getter for more optimizy goodness
Object.defineProperty(this, 'stack', {
get: function () {
return tmp.stack
}
})

return this
}
var IntermediateInheritor = function () {}
IntermediateInheritor.prototype = Error.prototype
MyError.prototype = new IntermediateInheritor()

var myError = new MyError("message")
console.log("The message is: '"+myError.message+"'") // The message is: 'message'
console.log(myError instanceof Error) // true
console.log(myError instanceof MyError) // true
console.log(myError.toString()) // MyError: message
console.log(myError.stack) // MyError: message \n
// <stack trace ...>

目前这种方法的唯一问题(我已经稍微迭代了一下)是

  • stackmessage 以外的属性不包含在 MyError 中,并且
  • stacktrace 有一个额外的行,这并不是真正必要的。

第一个问题可以通过使用此答案中的技巧遍历错误的所有不可枚举属性来解决:Is it possible to get the non-enumerable inherited property names of an object? ,但这不受 ie<9 支持。第二个问题可以通过删除堆栈跟踪中的那一行来解决,但我不确定如何安全地这样做(也许只是删除 e.stack.toString() 的第二行 ??)。

更新

我创建了一个执行此操作的继承库 ^ https://github.com/fresheneesz/proto

关于javascript - 从 Error 对象继承 - message 属性在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8802845/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com