gpt4 book ai didi

javascript - NodeJS 对象继承

转载 作者:太空宇宙 更新时间:2023-11-04 00:32:50 25 4
gpt4 key购买 nike

我有一个自定义错误对象,它扩展了 Error 对象:

function GTError(reason, loglevel, meta) {
winston.log(loglevel, reason, meta);
GTError.super_.apply(this, arguments);
}

util.inherits(GTError, Error);

我知道这不起作用,并且 this question有解决方法。我的问题不是如何解决它,我的问题是为什么它不起作用?为什么调用 GTError.super_.apply(this, argument); (其中 GTError.super_Error)不会填充 消息this 属性?

enter image description here

你能解释一下吗?谢谢

最佳答案

My question isn't how to work around it, my question is why doesn't it work?

因为 Error 函数总是返回一个新实例,即使您不使用 new 调用它;当您调用它时,它不会修改 this 引用的对象。来自 the ES5 specification :

When Error is called as a function rather than as a constructor, it creates and initialises a new Error object. Thus the function call Error(…) is equivalent to the object creation expression new Error(…) with the same arguments.

因此,在您的代码中,GTError.super_.apply(this,arguments);(其中 GTError.super_Error)实际上是一个无操作,因为它创建并丢弃 Error 对象,而不是使 Error 填充作为 this 传递的对象。事实上,由于 Error 的定义方式,(在 ES5 中)无法让 Error 填充 new GTError 表达式中由 new 创建的对象。

TC-39 委员会在 ES2015 中修复了这个问题,但仅当您使用新的类内容时(为了保持向后兼容性)。

<小时/>

我知道你说你只是想知道为什么,但对其他人来说:在 ES2015 及更高版本中,你可以通过新的 class 内容正确地子类 Error 。至少在严格模式下的 Node v4 中支持此语法,并且在 Node v6 中普遍支持。以下内容适用于任何最新版本的 Chrome 或 Firefox:

let winston = {
log: function(...args) {
console.log("log", ...args);
}
};
class GTError extends Error {
constructor(reason, loglevel, meta) {
winston.log(loglevel, reason, meta);
super(reason, loglevel, meta);
}
}
try {
throw new GTError("reason", 10, "meta");
}
catch (e) {
console.log(e instanceof Error);
console.log(e instanceof GTError);
console.log(e.message);
}

关于javascript - NodeJS 对象继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40327180/

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