<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Oct 24, 2015 at 8:00 PM, Sebastian McKenzie <span dir="ltr"><<a href="mailto:sebmck@gmail.com" target="_blank">sebmck@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><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" target="_blank">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></blockquote><div><br></div><div>I'm surprised. Good catch! Frankly, this case had never occurred to me and I do not remember discussing it. I would certainly prefer that it be an error without constructing twice.</div><div><br></div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><br></div><div>Any insight (or correction) is extremely appreciated, thank you!</div></div>
<br>_______________________________________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" rel="noreferrer" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
<br></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature">    Cheers,<br>    --MarkM</div>
</div></div>