遵循ECMAScript规范理解JavaScript super()调用 密码 出身背景
当我试图准确理解类构造函数中的遵循ECMAScript规范理解JavaScript super()调用 密码 出身背景,javascript,class,ecmascript-6,ecmascript-2017,Javascript,Class,Ecmascript 6,Ecmascript 2017,当我试图准确理解类构造函数中的super()调用是如何工作的时,我遵循了以下操作顺序: 召唤 kind是派生的(在中的较早设置),因此没有绑定新的此值 调用,它最终计算子类构造函数方法的主体,其中super()是第一条语句 调用,这将使我们回到步骤3,这次只使用kindasbase 由于kind现在是base,因此将创建一个新的此绑定,并将其绑定到为父构造函数创建的新函数环境的环境记录 父级构造函数主体的其余部分执行,一旦完成,控制流回到子级。[[Construct]],从第11步继续执行 最后
super()
调用是如何工作的时,我遵循了以下操作顺序:
kind
是派生的(在中的较早设置),因此没有绑定新的此
值子类
构造函数方法的主体,其中super()
是第一条语句kind
asbasekind
现在是base,因此将创建一个新的此
绑定,并将其绑定到为父
构造函数创建的新函数环境的环境记录构造函数主体的其余部分执行,一旦完成,控制流回到子级。[[Construct]]
,从第11步继续执行Child.[Construct]
尝试返回envRec.GetThisBinding
问题 在
Child.[Construct]
的步骤6
中创建的子构造函数的环境记录没有此绑定([[ThisBindingStatus]]
未初始化)。因此,当我们在步骤8中尝试执行envRec.GetThisBinding
时,据我所知,我们应该得到一个ReferenceError
()
我错过了什么?我似乎不明白为什么子构造函数不会抛出错误,而且如果子构造函数的[[ThisValue]]]
完全设置好了。您错过了链接中的一个步骤:
让newTarget
成为GetNewTarget()
断言:Type(newTarget)
是对象
让func
be<代码>GetSuperConstructor()
让argList
成为参数的argumentListValuation
ReturnIfAbrupt(argList)
让result
be<代码>构造(func、argList、newTarget)
让thisERbeGetThisEnvironment()
返回<代码>thisER.BindThisValue(结果)
李>
步骤6
调用ParentConstructor。[[Construct]]
,如您所述,但是步骤8将把Child
构造函数体中的this
绑定设置为构造值,因此当envRec.GetThisBinding
在ChildConstructor.[Construct]
末尾运行时,这个
绑定将在那里我试图在规范中找到这些行,但是我所有的搜索都失败了。这些是文字引语还是你在解释?你能链接到你所询问的特定部分吗?谢谢你的浏览,@Barmar。以上步骤是实际发生情况的浓缩版本。有太多的步骤来列出所有内容,但为了便于参考,我已经在关键步骤中链接了重要的算法。
class Parent {
constructor() {}
}
class Child extends Parent {
constructor() {
super();
}
}