了解这个'对象的原型函数的关键字

时间:2016-06-19 11:22:35

标签: javascript node.js

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作为第一个和第二个参数,以便这个工作?

1 个答案:

答案 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进行转换。但是,无论你想做什么,这都可能有点过头了。