我有一个扩展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, arguments);
(其中GTError.super_
为Error
)不会填充message
的{{1}}属性?
答案 0 :(得分:1)
我的问题不是如何解决这个问题,我的问题是为什么不起作用?
因为Error
函数始终返回一个新实例,即使您没有使用new
调用它;当你调用它时,它不会修改对象this
。来自the ES5 specification:
当
Error
作为函数而不是构造函数调用时,它会创建并初始化一个新的Error
对象。因此,函数调用Error(…)
等同于具有相同参数的对象创建表达式new Error(…)
。
因此,在您的代码中,GTError.super_.apply(this, arguments);
(其中GTError.super_
为Error
)实际上是无操作,因为它会创建并丢弃Error
对象而不是制作Error
填充传递为this
的对象。实际上,由于Error
表达方式new
,new GTError
无法在Error
中填充由Error
创建的对象。定义
TC-39委员会在ES2015中确定了这一点,但仅限于您使用新课程时(为了保持向后兼容性)。
我知道你说你只是想知道原因,但是对于其他人:在ES2015及更高版本中,你可以通过新的class
内容正确地将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);
}
子类化。至少在严格模式下的Node v4中支持此语法,并且在Node v6中通用。以下内容适用于任何最新版本的Chrome或Firefox:
$("#prop_id")
.change(function () {
var str = "";
$("#prop_id option:selected").each(function () {
str += $(this).text() + " ";
});
$("#removeid").val(str);
}).change();