遵循ECMAScript规范了解JavaScript super()调用

时间:2018-08-15 16:09:41

标签: javascript class ecmascript-6 ecmascript-2017

代码

class Parent {
  constructor() {}
}

class Child extends Parent {
  constructor() {
    super();
  }
}

背景

当我试图确切了解类构造函数中super()调用的工作方式时,我遵循了ECMAScript操作的以下顺序:

  1. new Child()呼叫ChildConstructor.[[Construct]]
  2. kind派生的(先前在14.5.15中设置),因此没有新的this值被绑定
  3. OrdinaryCallEvaluateBody被调用,最终评估Child类构造方法的主体,其中super()是第一条语句
  4. super()呼叫ParentConstructor.[[Construct]],这使我们回到第3步,只是这次以kind作为 base
  5. 由于kind现在是 base 的基础,因此将创建新的this绑定并将其绑定到新功能的环境记录Parent构造函数创建的环境
  6. Parent构造函数主体的其余部分执行,一旦完成,控制权流回到Child.[[Construct]],执行从第11步继续进行
  7. 最后,Child.[[Construct]]尝试返回envRec.GetThisBinding

问题

Child的{​​{1}}中创建的step 6构造函数的环境记录没有Child.[[Construct]]绑定(this未初始化)。因此,当我们尝试在步骤8中进行[[ThisBindingStatus]]时,据我所知,应该得到envRec.GetThisBindingas specified here)。

我在这里想念什么?我似乎看不出为什么ReferenceError构造函数不会引发错误,以及实际上是否完全设置了Child构造函数的[[ThisValue]]

1 个答案:

答案 0 :(得分:1)

您错过了super()链接中的步骤:

  
      
  1. newTargetGetNewTarget()
  2.   
  3. 声明:Type(newTarget)是对象。
  4.   
  5. func是吗? GetSuperConstructor()
  6.   
  7. argListArgumentListEvaluation的{​​{1}}。
  8.   
  9. Arguments
  10.   
  11. ReturnIfAbrupt(argList)是吗? result
  12.   
  13. Construct(func, argList, newTarget)thisER
  14.   
  15. 返回? GetThisEnvironment( )
  16.   

步骤thisER.BindThisValue(result)调用了6,但是步骤8会将ParentConstructor.[[Construct]]构造函数主体中的this绑定设置为构造值,因此当{{ 1}}从Child开始运行,envRec.GetThisBinding绑定将在那里