<div dir="ltr">The specific line in rev32 of the spec that prevents [[Call]]ing "classConstructor" functions is <a href="https://people.mozilla.org/~jorendorff/es6-draft.html#sec-ecmascript-function-objects-call-thisargument-argumentslist" target="_blank">9.2.2.2</a>:<br><br><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><span style="color:rgb(51,51,51);font-family:Cambria,'Palatino Linotype',Palatino,'Liberation Serif',serif;line-height:22.9500007629395px;background-color:rgb(253,253,252)">2. If </span><i style="color:rgb(51,51,51);font-family:Cambria,'Palatino Linotype',Palatino,'Liberation Serif',serif;line-height:22.9500007629395px;background-color:rgb(253,253,252)">F</i><span style="color:rgb(51,51,51);font-family:Cambria,'Palatino Linotype',Palatino,'Liberation Serif',serif;line-height:22.9500007629395px;background-color:rgb(253,253,252)">’s [[FunctionKind]]</span><span style="color:rgb(51,51,51);font-family:Cambria,'Palatino Linotype',Palatino,'Liberation Serif',serif;line-height:22.9500007629395px;background-color:rgb(253,253,252)"> </span><a href="https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object-internal-methods-and-internal-slots" style="font-family:Cambria,'Palatino Linotype',Palatino,'Liberation Serif',serif;line-height:22.9500007629395px;text-decoration:none;color:rgb(51,51,187);background-color:rgb(253,253,252)">internal slot</a><span style="color:rgb(51,51,51);font-family:Cambria,'Palatino Linotype',Palatino,'Liberation Serif',serif;line-height:22.9500007629395px;background-color:rgb(253,253,252)"> </span><span style="color:rgb(51,51,51);font-family:Cambria,'Palatino Linotype',Palatino,'Liberation Serif',serif;line-height:22.9500007629395px;background-color:rgb(253,253,252)">is "</span><code style="line-height:22.9500007629395px;color:rgb(85,85,85);font-weight:bold;font-family:'Courier New',monospace;white-space:nowrap;background-color:rgb(253,253,252)">classConstructor</code><span style="color:rgb(51,51,51);font-family:Cambria,'Palatino Linotype',Palatino,'Liberation Serif',serif;line-height:22.9500007629395px;background-color:rgb(253,253,252)">", throw a</span><span style="color:rgb(51,51,51);font-family:Cambria,'Palatino Linotype',Palatino,'Liberation Serif',serif;line-height:22.9500007629395px;background-color:rgb(253,253,252)"> </span><b style="font-family:Cambria,'Palatino Linotype',Palatino,'Liberation Serif',serif;line-height:22.9500007629395px;color:rgb(85,85,85);background-color:rgb(253,253,252)">TypeError</b><span style="color:rgb(51,51,51);font-family:Cambria,'Palatino Linotype',Palatino,'Liberation Serif',serif;line-height:22.9500007629395px;background-color:rgb(253,253,252)"> </span><span style="color:rgb(51,51,51);font-family:Cambria,'Palatino Linotype',Palatino,'Liberation Serif',serif;line-height:22.9500007629395px;background-color:rgb(253,253,252)">exception.</span></div></blockquote><div><br></div><div>From my reading of the spec, I think the idiomatic <font face="monospace, monospace">Foo.call(this)</font> pattern that Luke Scott described would work if we simply changed that line to something slightly weaker:</div><div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><span style="color:rgb(51,51,51);font-family:Cambria,'Palatino Linotype',Palatino,'Liberation Serif',serif;line-height:22.9500007629395px;background-color:rgb(253,253,252)"><br class="">2. If </span><i style="color:rgb(51,51,51);font-family:Cambria,'Palatino Linotype',Palatino,'Liberation Serif',serif;line-height:22.9500007629395px;background-color:rgb(253,253,252)">F</i><span style="color:rgb(51,51,51);font-family:Cambria,'Palatino Linotype',Palatino,'Liberation Serif',serif;line-height:22.9500007629395px;background-color:rgb(253,253,252)">’s [[FunctionKind]]</span><span style="color:rgb(51,51,51);font-family:Cambria,'Palatino Linotype',Palatino,'Liberation Serif',serif;line-height:22.9500007629395px;background-color:rgb(253,253,252)"> </span><a href="https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object-internal-methods-and-internal-slots" style="color:rgb(51,51,187);font-family:Cambria,'Palatino Linotype',Palatino,'Liberation Serif',serif;line-height:22.9500007629395px;text-decoration:none;background-color:rgb(253,253,252)">internal slot</a><span style="color:rgb(51,51,51);font-family:Cambria,'Palatino Linotype',Palatino,'Liberation Serif',serif;line-height:22.9500007629395px;background-color:rgb(253,253,252)"> </span><span style="color:rgb(51,51,51);font-family:Cambria,'Palatino Linotype',Palatino,'Liberation Serif',serif;line-height:22.9500007629395px;background-color:rgb(253,253,252)">is "</span><code style="line-height:22.9500007629395px;color:rgb(85,85,85);font-weight:bold;font-family:'Courier New',monospace;white-space:nowrap;background-color:rgb(253,253,252)">classConstructor</code><span style="color:rgb(51,51,51);font-family:Cambria,'Palatino Linotype',Palatino,'Liberation Serif',serif;line-height:22.9500007629395px;background-color:rgb(253,253,252)">" and</span><span style="color:rgb(51,51,51);font-family:Cambria,'Palatino Linotype',Palatino,'Liberation Serif',serif;line-height:22.9500007629395px;background-color:rgb(253,253,252)"> </span><a href="https://people.mozilla.org/~jorendorff/es6-draft.html#sec-instanceofoperator" style="text-decoration:none;color:rgb(51,51,187);font-family:Cambria,'Palatino Linotype',Palatino,'Liberation Serif',serif;line-height:22.9500007629395px;background-color:rgb(253,253,252)">InstanceofOperator</a><span style="color:rgb(51,51,51);font-family:Cambria,'Palatino Linotype',Palatino,'Liberation Serif',serif;line-height:22.9500007629395px;background-color:rgb(253,253,252)">(</span><i style="color:rgb(51,51,51);font-family:Cambria,'Palatino Linotype',Palatino,'Liberation Serif',serif;line-height:22.9500007629395px;background-color:rgb(253,253,252)">thisArgument</i><span style="color:rgb(51,51,51);font-family:Cambria,'Palatino Linotype',Palatino,'Liberation Serif',serif;line-height:22.9500007629395px;background-color:rgb(253,253,252)">, </span><i style="color:rgb(51,51,51);font-family:Cambria,'Palatino Linotype',Palatino,'Liberation Serif',serif;line-height:22.9500007629395px;background-color:rgb(253,253,252)">F</i><span style="color:rgb(51,51,51);font-family:Cambria,'Palatino Linotype',Palatino,'Liberation Serif',serif;line-height:22.9500007629395px;background-color:rgb(253,253,252)">)</span><span style="color:rgb(51,51,51);font-family:Cambria,'Palatino Linotype',Palatino,'Liberation Serif',serif;line-height:22.9500007629395px;background-color:rgb(253,253,252)"> is <b>false,</b> throw a</span><span style="color:rgb(51,51,51);font-family:Cambria,'Palatino Linotype',Palatino,'Liberation Serif',serif;line-height:22.9500007629395px;background-color:rgb(253,253,252)"> </span><b style="font-family:Cambria,'Palatino Linotype',Palatino,'Liberation Serif',serif;line-height:22.9500007629395px;color:rgb(85,85,85);background-color:rgb(253,253,252)">TypeError</b><span style="color:rgb(51,51,51);font-family:Cambria,'Palatino Linotype',Palatino,'Liberation Serif',serif;line-height:22.9500007629395px;background-color:rgb(253,253,252)"> </span><span style="color:rgb(51,51,51);font-family:Cambria,'Palatino Linotype',Palatino,'Liberation Serif',serif;line-height:22.9500007629395px;background-color:rgb(253,253,252)">exception.</span></blockquote></div><div><br></div><div>This mirrors an assertion discipline that has saved me from many bugs due to forgetting the <font face="monospace, monospace">new</font> operator:</div><div><br></div><div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><font face="monospace, monospace">function Base() {<br>  <b>assert.ok(this instanceof Base);</b><br>  ...<br>}<br><br>function Derived() {<br>  <b>assert.ok(this instanceof Derived);</b><br>  Base.call(this);<br>  ...<br>}<br><br>Derived.prototype = Object.create(Base.prototype, {<br>  constructor: { value: Derived, ... }<br>});</font></blockquote></div><div><br></div><div>Is the addition of the <font face="monospace, monospace">instanceof</font> check naive? Would it invalidate any of the assumptions involved in the invocation of F?</div><div><br></div><div>I'm happy to file a bug if this change merits further consideration.</div><div><br></div><div>It may be worth noting that only constructors created by <font face="monospace, monospace">class</font> syntax will have their [[FunctionKind]] internal slot set to "classConstructor", so (even with the current spec) you can still invoke ordinary constructor functions using [[Call]]. However, it seems regrettable that you have to know whether a constructor was created by <font face="monospace, monospace">class</font> syntax in order to know whether the <font face="monospace, monospace">Foo.call(this)</font> pattern is safe.</div></div>