@Brendan My mistake was thinking that setting enumerable to false also made it return false on hasOwnProperty().<div><br></div><div>The idea behind it was to be able to walk down the prototype chain by doing o.constructor.prototype.contructor.proto... But then I realized that's not the case even in today's javascript.<div>

<br></div><div>Maybe adding a 'superclass' property to the constructor could be useful? As in...</div><div><br></div><div><font class="Apple-style-span" face="'courier new', monospace">function S() {}</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace">function C() {}</font></div><div><font class="Apple-style-span" face="'courier new', monospace">C.protototype = Object.create(S.prototype, {</font><span class="Apple-style-span" style="font-family: 'courier new', monospace; "> 'constructor': {</span><span class="Apple-style-span" style="font-family: 'courier new', monospace; ">value: C</span><span class="Apple-style-span" style="font-family: 'courier new', monospace; ">} </span><span class="Apple-style-span" style="font-family: 'courier new', monospace; ">});</span></div>

<div><font class="Apple-style-span" face="'courier new', monospace">Object.defineProperty(C, 'superclass', {</font><span class="Apple-style-span" style="font-family: 'courier new', monospace; "> value: S </span><span class="Apple-style-span" style="font-family: 'courier new', monospace; ">});</span></div>

<div><br></div><div>Juan</div><div><br><div class="gmail_quote">On Sun, Mar 13, 2011 at 6:16 PM, Brendan Eich <span dir="ltr"><<a href="mailto:brendan@mozilla.com">brendan@mozilla.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

<div style="word-wrap:break-word"><div><div>On Mar 12, 2011, at 6:05 PM, Juan Ignacio Dopazo wrote:</div><br><blockquote type="cite">Right, my bad then.</blockquote><div><br></div>Maybe not, it's a difference but possibly someone will make the case for it. I still favor putting 'constructor' on the class prototype (constructor function .prototype in plain old ES5). It is more efficient and usually per-instance is neither wanted for some "hasOwnProperty('constructor') must return true" reason (presumably to prevent shadowing).</div>

<div><br></div><div>If one wants higher integrity, Object.defineProperty(C.prototype, 'constructor', {value:C, writable:false, configurable:false}} does the trick (that is verbose on purpose to be clear, there's a much shorter way to say it, using the default undefined->false conversions for missing attributes).</div>

<div><br></div><div>Allen, did you want 'constructor' to be in the class prototype?</div><div><div></div><div class="h5"><div><br></div><div>/be</div><div><br><blockquote type="cite"><div><br></div><div>Juan<br><br>

<div class="gmail_quote">On Sat, Mar 12, 2011 at 8:37 PM, Brendan Eich <span dir="ltr"><<a href="mailto:brendan@mozilla.com" target="_blank">brendan@mozilla.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div>On Mar 12, 2011, at 2:58 PM, Juan Ignacio Dopazo wrote:<br>
<br>
> Correct me if I'm wrong, but I think it should be like this:<br>
><br>
> function S() {}<br>
><br>
> function C() {<br>
>       Object.defineProperty(this, 'constructor', {<br>
>               value: C,<br>
>               enumerable: false,<br>
>               writable: false,<br>
>               configurable: false<br>
>       });<br>
> }<br>
> C.prototype = Object.create(S.prototype);<br>
><br>
> var o = new C();<br>
> console.log(o.constructor == C); // true<br>
> console.log(o.constructor.prototype.constructor == S); // true<br>
<br>
</div>But this also puts an own property on every instance, which is not how .constructor works with functions:<br>
<br>
js> function C(x) { this.x = x; }<br>
js> c = new C(42)<br>
({x:42})<br>
js> c.hasOwnProperty('x')<br>
true<br>
js> c.hasOwnProperty('constructor')<br>
false<br>
js> c.constructor<br>
function C(x) {this.x = x;}<br>
js> c.constructor === C<br>
true<br>
<font color="#888888"><br>
/be<br>
</font><div><div></div><div><br>
><br>
> Juan<br>
><br>
><br>
> On Sat, Mar 12, 2011 at 4:36 PM, Allen Wirfs-Brock <<a href="mailto:allen@wirfs-brock.com" target="_blank">allen@wirfs-brock.com</a>> wrote:<br>
> good point, the desugaring should be:<br>
><br>
> function c() {};<br>
> c.prototype=Object.create(s,protoype,{'constructor': { value:c, enumerable: false, writable: false, configurable:false}});<br>
><br>
> We can debate about the attributes of the constructor (and the constructor's prototype) property but my stake in the ground is that these should be frozen because they are defined declaratively.<br>
><br>
> On Mar 12, 2011, at 11:06 AM, Michael Haufe wrote:<br>
><br>
>> On Sat, Mar 12, 2011 at 11:02 AM, Allen Wirfs-Brock <<a href="mailto:allen@wirfs-brock.com" target="_blank">allen@wirfs-brock.com</a>> wrote:<br>
>> [...]<br>
>> > class c {<br>
>> >    <proto: s.prototype><br>
>> > }<br>
>><br>
>> > class c {<br>
>> >    <superclass: s><br>
>> > }<br>
>><br>
>> > both are equivalent to:<br>
>><br>
>> > function c() {};<br>
>> > c.prototype=Object.create(s.prototype);<br>
>> [...]<br>
>><br>
>> So if "var b = new c", then "b.constructor" will be "s" instead of "c"?<br>
>><br>
>><br>
><br>
><br>
> _______________________________________________<br>
> es-discuss mailing list<br>
> <a href="mailto:es-discuss@mozilla.org" target="_blank">es-discuss@mozilla.org</a><br>
> <a href="https://mail.mozilla.org/listinfo/es-discuss" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
><br>
><br>
> _______________________________________________<br>
> es-discuss mailing list<br>
> <a href="mailto:es-discuss@mozilla.org" target="_blank">es-discuss@mozilla.org</a><br>
> <a href="https://mail.mozilla.org/listinfo/es-discuss" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
<br>
</div></div></blockquote></div><br></div>
</blockquote></div><br></div></div></div></blockquote></div><br></div></div>