class Parent {
constructor() {}
}
class Child extends Parent {
constructor() {
super();
}
}
当我试图确切了解类构造函数中super()
调用的工作方式时,我遵循了ECMAScript操作的以下顺序:
kind
是派生的(先前在14.5.15中设置),因此没有新的this
值被绑定Child
类构造方法的主体,其中super()
是第一条语句kind
作为 base kind
现在是 base 的基础,因此将创建新的this
绑定并将其绑定到新功能的环境记录为Parent
构造函数创建的环境 Parent
构造函数主体的其余部分执行,一旦完成,控制权流回到Child.[[Construct]]
,执行从第11步继续进行Child.[[Construct]]
尝试返回envRec.GetThisBinding
在Child
的{{1}}中创建的step 6
构造函数的环境记录没有Child.[[Construct]]
绑定(this
已未初始化)。因此,当我们尝试在步骤8中进行[[ThisBindingStatus]]
时,据我所知,应该得到envRec.GetThisBinding
(as specified here)。
我在这里想念什么?我似乎看不出为什么ReferenceError
构造函数不会引发错误,以及实际上是否完全设置了Child
构造函数的[[ThisValue]]
。
答案 0 :(得分:1)
您错过了super()
链接中的步骤:
- 让
newTarget
为GetNewTarget()
。- 声明:
Type(newTarget)
是对象。- 让
func
是吗?GetSuperConstructor()
。- 让
argList
为ArgumentListEvaluation
的{{1}}。Arguments
。- 让
ReturnIfAbrupt(argList)
是吗?result
。- 让
Construct(func, argList, newTarget)
为thisER
。- 返回?
GetThisEnvironment( )
。
步骤thisER.BindThisValue(result)
调用了6
,但是步骤8会将ParentConstructor.[[Construct]]
构造函数主体中的this
绑定设置为构造值,因此当{{ 1}}从Child
开始运行,envRec.GetThisBinding
绑定将在那里