var Controller = function () {
try {
throw new this.userException('test', 'test');
} catch (error) {
if (error instanceof this.userException) {
console.error(error.stack);
}
}
}
Controller.prototype.userException = function (name, message, htmlMessage) {
this.name = name;
this.message = message;
this.htmlMessage = htmlMessage;
Error.captureStackTrace(this, this.userException);
this.toString = function () {
return name + ' : ' + message;
}
};
当我尝试创建自定义异常时,我在Node JS文档中找到了这个Error.captureStackTrace
。首先,我使用它如下。
Error.captureStackTrace(this, userException);
哪个console.error(error)
没有输出。由于我将错误更改为
Error.captureStackTrace(this, this.userException);
哪个返回对象包含userException
方法的属性。另外console.error(error.stack);
打印stack trace
。我很困惑this
关键字如何在此声明Error.captureStackTrace(this, this.userException);
中工作。第一个和第二个参数的this
个关键字指向什么?是同一个Controller
对象?但同样,为什么我必须提供this
作为第一个和第二个参数,以便这个工作?
答案 0 :(得分:0)
由于您是通过userException
致电new
,因此this
内的new
是由userException
运营商创建的新对象。这与现在通常称为原型函数不同,并建议Controller.prototype
可能不应该在this.userException
上。
当您没有userException
时,您的代码失败了,因为它期望有一个范围内的this.
标识符,但没有(它是控制器原型的属性) ,而不是独立标识符。)
当您在其前面添加this
时,它开始工作,因为它不再查找独立标识符,它会查找具有该名称的undefined
属性。没有,但没关系,它最终会将captureStackTrace
传递给captureStackTrace
。
看看我能为undefined
找到什么,第二个参数是可选的,如果给定的是一个函数,那么可能只是忽略你给它的Error.captureStackTrace(this);
而你可以/应该正在进行Error
。
相关:
请注意,在ES5及更早版本中,子类化class
非常困难;不要尝试自己动手,使用已经为你建造的东西。 Babel背后的优秀人员(您可以在ES5 JavaScript引擎上使用ES2015 [以及之后]使用的JavaScript转换器)已经为您完成了这项工作。您可以使用ES2015的Error
语法扩展{{1}}并使用Babel进行转换。但是,无论你想做什么,这都可能有点过头了。