<div dir="ltr">I was recently reading the specification on the behaviour of duplicate super() calls in derived constructors. Reading the grammar the following is valid:
<div><br></div><div>```</div><div>class Foo {</div><div>  constructor() {</div><div>    console.log("foobar);</div><div>  }</div><div>}</div><div><br></div><div>class Bar extends Foo {</div><div>  constructor() {</div><div>    super();</div><div>    super();</div><div>  }</div><div>}</div><div><br></div><div>new Bar;</div><div>```</div><div><br></div><div>However my reading of the runtime semantics, it will actually execute the constructor body <b>twice. </b>And so "foo" will be printed two times.</div><div><br></div><div>This is because the only thing I've found stopping duplicate super calls is step 10 of SuperCall in <a href="http://www.ecma-international.org/ecma-262/6.0/index.html#sec-super-keyword-runtime-semantics-evaluation">12.3.5.1</a>:</div><div><ol><li>Let newTarget be GetNewTarget().<br></li><li>If newTarget is undefined, throw a ReferenceError exception.<br></li><li>Let func be GetSuperConstructor().<br></li><li>ReturnIfAbrupt(func).<br></li><li>Let argList be ArgumentListEvaluation of Arguments.<br></li><li>ReturnIfAbrupt(argList).<br></li><li>Let result be Construct(func, argList, newTarget).<br></li><li>ReturnIfAbrupt(result).<br></li><li>Let thisER be GetThisEnvironment( ).<br></li><li>Return thisER.BindThisValue(result).<br></li></ol></div><div>Since BindThisValue will throw a ReferenceError if `this` has already been initialised:</div><div><br></div><ol><li>Let envRec be the function Environment Record for which the method was invoked.<br></li><li>Assert: envRec.[[thisBindingStatus]] is not "lexical".<br></li><li>If envRec.[[thisBindingStatus]] is "initialized", throw a ReferenceError exception.</li></ol><div>But this check is performed at step 10 whereas the super constructor is actually evaluated at step 7.</div><div><br></div><div>Is my reading correct? If so, to me this behaviour seems quite unexpected.</div><div><br></div><div>Any insight (or correction) is extremely appreciated, thank you!</div></div>