Typescript 在调用“super(…)”(或“WTF令人费解的故事”之前,提前关闭“this”。)

Typescript 在调用“super(…)”(或“WTF令人费解的故事”之前,提前关闭“this”。),typescript,closures,this,super,Typescript,Closures,This,Super,在做了一些修改之后,我最终用打字机写下了以下内容: B类扩展了A类{ 构造函数(){ const c=newc(()=>this.method()); 超级(c); c、 某种方法(此); } } 而且它是有效的 让我们暂且不谈我为什么这么做(与我的问题无关) 我的问题是: 当我在调用super之前做一些事情时,它究竟是如何编译的 行const c=new c(()=>this.method())如何处理结束此何时尚未定义? 至少this不应该可用,或者我宁愿做const c=new c(

在做了一些修改之后,我最终用打字机写下了以下内容:

B类扩展了A类{
构造函数(){
const c=newc(()=>this.method());
超级(c);
c、 某种方法(此);
}
}
而且它是有效的

让我们暂且不谈我为什么这么做(与我的问题无关)

我的问题是:

  • 当我在调用
    super
    之前做一些事情时,它究竟是如何编译的
  • const c=new c(()=>this.method())如何处理结束<代码>此
    何时尚未定义?
    • 至少
      this
      不应该可用,或者我宁愿做
      const c=new c(this.method)但它没有编译,抱怨
      这还不可用

我遗漏了一些东西:/

是的,我想我明白了为什么这会困扰你。GitHub中的相关问题是。让我们看看我能否回答这些问题:


  • 当我在调用
    super
    之前做一些事情时,它究竟是如何编译的
显然是因为。从相关问题来看:

如果没有成员初始值设定项,您可以随时调用
super

如果查看类成员初始值设定项是如何发出的,那么其原因就相当清楚了。成员初始值设定项在超级调用后发出(否则派生类初始值设定项不会正确覆盖基类初始化);通过强制超级调用作为第一件事,编译器可以保证有一个(正确的)位置来发出这些初始值设定项

通过删除成员初始值设定项,可以将超级调用移动到任何位置——这将明确显示每个类成员的初始化顺序

我认为语言设计者认为在调用
super
之前,有些人可以做一些合法的事情(例如,做一些计算来确定向
super
调用传递什么),但是有一些事情是有问题的:成员初始值设定项(作为对
this
的引用发送到JS),并明确引用此


  • 至少这不应该是可用的,或者我宁愿做const
    c=newc(this.method)但它没有编译,抱怨
    这还不可用
对,您不能在调用
super
之前引用裸露的
this.method
,因为
this
不保证在当时存在


  • const c=new c(()=>this.method())如何处理结束<代码>此
    何时尚未定义
我对接受闭包的猜测是,对
this
的引用不能被认为是来自
super
调用。这可能是也可能不是编译器中的错误或设计限制。在您的例子中,如果
C
的构造函数实际上没有调用该函数,那么可能没有问题。。。闭包可能会将
this.method
的取消引用推迟到子类构造函数完成之后。但是由于
C
的构造函数可能调用该函数,因此代码可能不安全

如果您强烈认为这应该给出编译器警告,那么您可能希望在GitHub和reference中提出一个问题(您不能对该问题发表评论,因为它已被锁定)


希望有帮助。祝你好运

是的,我想我明白为什么这会困扰你了。GitHub中的相关问题是。让我们看看我能否回答这些问题:


  • 当我在调用
    super
    之前做一些事情时,它究竟是如何编译的
显然是因为。从相关问题来看:

如果没有成员初始值设定项,您可以随时调用
super

如果查看类成员初始值设定项是如何发出的,那么其原因就相当清楚了。成员初始值设定项在超级调用后发出(否则派生类初始值设定项不会正确覆盖基类初始化);通过强制超级调用作为第一件事,编译器可以保证有一个(正确的)位置来发出这些初始值设定项

通过删除成员初始值设定项,可以将超级调用移动到任何位置——这将明确显示每个类成员的初始化顺序

我认为语言设计者认为在调用
super
之前,有些人可以做一些合法的事情(例如,做一些计算来确定向
super
调用传递什么),但是有一些事情是有问题的:成员初始值设定项(作为对
this
的引用发送到JS),并明确引用此


  • 至少这不应该是可用的,或者我宁愿做const
    c=newc(this.method)但它没有编译,抱怨
    这还不可用
对,您不能在调用
super
之前引用裸露的
this.method
,因为
this
不保证在当时存在


  • const c=new c(()=>this.method())如何处理结束<代码>此
    何时尚未定义
我对接受闭包的猜测是,对
this
的引用不能被认为是来自
super
调用。这可能是也可能不是编译器中的错误或设计限制。在您的例子中,如果
C
的构造函数实际上没有调用该函数,那么可能没有问题。。。闭包c