遵循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()
    是第一条语句
  • 调用,这将使我们回到步骤3,这次只使用
    kind
    asbase
  • 由于
    kind
    现在是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)
  • 让thisER
    be
    GetThisEnvironment()
  • 返回<代码>thisER.BindThisValue(结果)

  • 步骤
    6
    调用
    ParentConstructor。[[Construct]]
    ,如您所述,但是步骤8将把
    Child
    构造函数体中的
    this
    绑定设置为构造值,因此当
    envRec.GetThisBinding
    ChildConstructor.[Construct]
    末尾运行时,
    这个
    绑定将在那里

    我试图在规范中找到这些行,但是我所有的搜索都失败了。这些是文字引语还是你在解释?你能链接到你所询问的特定部分吗?谢谢你的浏览,@Barmar。以上步骤是实际发生情况的浓缩版本。有太多的步骤来列出所有内容,但为了便于参考,我已经在关键步骤中链接了重要的算法。
    class Parent {
      constructor() {}
    }
    
    class Child extends Parent {
      constructor() {
        super();
      }
    }