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