<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">See below:<div><br><div><div>On Dec 21, 2010, at 9:03 AM, Mark S. Miller wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">On Mon, Dec 20, 2010 at 9:21 AM, Allen Wirfs-Brock <span dir="ltr">&lt;<a href="mailto:allen@wirfs-brock.com">allen@wirfs-brock.com</a>&gt;</span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div style="word-wrap:break-word">I've seen mentions in the recent thread that the goal of the "Private Names" proposal was to support "private fields" for objects. &nbsp;While that may be a goal of some participants in the discussion, it is not what I would state as the goal.<div>
<br></div><div>I have two specific use cases in mind for "private names":</div><div>1) Allow JavaScript programmers, who choose to do so, to manage the direct accessibly of object <i>properties</i>. &nbsp;This may mean limiting access to methods of a particular instance, or to methods of the same "class", or to various friends or cohorts, etc.</div>
<div>2) Allow third-party <i>property</i> extensions to built-in objects or third-party frameworks that are guaranteed to not have naming conflicts &nbsp;with unrelated extensions to the same objects.</div><div><br></div><div>
Of these two use cases, the second may be the more important.</div></div></blockquote><div><br></div><div>I'm glad you agree. By incremental fiddling, such as repairing the encapsulation leaks of private names, perhaps we could brings these two proposals closer together to try to find common ground. However, this second use case would still be a real difference. &lt;<a href="http://wiki.ecmascript.org/doku.php?id=strawman:names_vs_soft_fields#conflict-free_object_extension_using_soft_fields">http://wiki.ecmascript.org/doku.php?id=strawman:names_vs_soft_fields#conflict-free_object_extension_using_soft_fields</a>&gt; uses your example of this use case. In light of your message, I just added a note on the crucial difference:</div>
<div><br></div></div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><div class="gmail_quote"><div><span class="Apple-style-span" style="font-family: 'Lucida Grande', Verdana, Lucida, Helvetica, Arial, sans-serif; font-size: 13px; "><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; ">
For defensive programming, best practice in many environments will be to freeze the primordials early, as the dual of the existing best practice that one should not mutate the primordials.&nbsp;<a href="http://crpit.com/confpapers/CRPITV91Holkner.pdf" class="urlextern" target="_blank" title="http://crpit.com/confpapers/CRPITV91Holkner.pdf" rel="nofollow" style="color: rgb(67, 105, 118); text-decoration: none; background-image: url(http://wiki.ecmascript.org/lib/tpl/default/images/link_icon.gif); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; padding-top: 1px; padding-right: 0px; padding-bottom: 1px; padding-left: 16px; background-position: 0px 1px; background-repeat: no-repeat no-repeat; ">Evaluating the dynamic behaviour of Python applications</a>&nbsp;(See also&nbsp;<a href="http://gnuu.org/2010/12/13/too-lazy-to-type/" class="urlextern" target="_blank" title="http://gnuu.org/2010/12/13/too-lazy-to-type/" rel="nofollow" style="color: rgb(67, 105, 118); text-decoration: none; background-image: url(http://wiki.ecmascript.org/lib/tpl/default/images/link_icon.gif); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; padding-top: 1px; padding-right: 0px; padding-bottom: 1px; padding-left: 16px; background-position: 0px 1px; background-repeat: no-repeat no-repeat; ">http://gnuu.org/2010/12/13/too-lazy-to-type/</a>) provides evidence that this will be compatible with much existing content. We should expect these best practices to grow during the time when people feel they can target ES5 but not yet ES6.</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; ">Consider if Object.prototype or Array.prototype were already frozen, as they should be, before the code above executes. Using soft fields, this extension works. Using private names, it is rejected.</p>
</span></div></div></blockquote><div class="gmail_quote"><div><span class="Apple-style-span" style="font-family: 'Lucida Grande', Verdana, Lucida, Helvetica, Arial, sans-serif; font-size: 13px; "><div>
<br></div></span></div></div></blockquote><div><br></div><div>Not everybody in the JavaScript community agrees that this style of defensive programming is desirable or should be a "best practice". &nbsp;On my blog, there was resistance expressed to JavaScript providing any sort of information hiding mechanism. I would not anticipate frozen primordials becoming the norm anytime soon.&nbsp;</div><div><br></div><div>Even if this style did become the norm, I don't see why you would argue in support of mechanisms that allow extension of frozen objects. &nbsp;Isn't the whole point of freezing to prevent any extensions. &nbsp;why is the fact that the extension is accomplished using a side-channel any more acceptable to you.</div><div><br></div><br><blockquote type="cite"><div class="gmail_quote"><div>&nbsp;</div><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><br></div><div>Note that I emphasized "properties" rather than a new concept such as "private fields". &nbsp;I believe we should be trying to build upon the conceptual foundation of the existing JavaScript object model whenever possible. We should strive to avoid introducing new concepts such as non-property fields into the object model. &nbsp;(see&nbsp;<a href="http://www.wirfs-brock.com/allen/posts/43" target="_blank">http://www.wirfs-brock.com/allen/posts/43</a>&nbsp;&nbsp;for further thoughts on this topic.)</div>
</div></blockquote><div><br></div><div>I find this latter point and your elaboration on that web page bizarre. It is the private names proposal that would change the object model, even if you consider these changes minor. The soft fields proposal does not change the object model <i><b>at all</b></i>. It has the semantics of a side table.</div></div></blockquote><div><br></div><div>I am speaking of the object model, as perceived to by a JavaScript programmer of moderate skill and also by JavaScript implementors. &nbsp;To me, an incremental extension of a concept that is already present (extending the set of values that can be used as a property name) is a much smaller extension to the object model than the introduction of a new form of per object state (whether called a private field, a soft field, or something else).</div><div><br></div><div>The fact that you are proposing implementing you object extension as a look-aside table doesn't mean it isn't a conceptual extension to the object model perceived by JavaScript programmers. &nbsp;That might arguably be the case if you were simply defining a set of conventions based upon Ephemeron tables for decorating objects with additional non-encapsulated state. &nbsp;However, as soon as you tie into either the language's property access syntax ( . and []) as you have (perhaps reluctantly) proposed you have extended the conceptual object model.</div><div><br></div><div>It seems to me, the real point of difference here is whether or not we should add a syntactic mechanism that supports information hiding in the context of JavaScript objects. &nbsp;Some constituents want this, others do not.&nbsp;</div><div><br></div><div>If you don't care about syntactic support for information hiding than we already have solutions. Ephemeron tables provide a side-band mechanisms for dynamically associating additional state with an objects. &nbsp;You have demonstrated one way to do that in your soft fields proposal. &nbsp; Even without Ephemeron tables, it is already possible to hide state within an object using closure capture.</div><div><br></div><div>However, neither of these mechanisms are integrated with the fundamental concept of an "object" that is defined by the language specification and taught to JavaScript programmers. &nbsp;They are based upon coding patterns that assume understanding of difficult concepts (Ephemeron or closure capture). &nbsp;In addition, in the context of current implementations their performance characteristics will be inferior relative to standard property access. &nbsp;If you care about these issues than you probably fall into the camp that wants some sort of syntactic and semantic language extension that explicitly supports object information hiding.</div><div><br></div><div><br></div><br><blockquote type="cite"><div class="gmail_quote">
<div><br></div><div>It seems both of your key points in this message support soft fields over private names.&nbsp;</div></div></blockquote><div><br></div><div>I don't think you even addressed my first point and your argument concerning the second point is based upon an assumption that I don't share regarding a particular "defensive programming" style.</div><div><br></div><br><blockquote type="cite"><div class="gmail_quote"><div>&nbsp;</div><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><br></div><font color="#888888"><div>Allen</div></font></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" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
<br></blockquote></div><br><br clear="all"><br>-- <br>&nbsp; &nbsp; Cheers,<br>&nbsp; &nbsp; --MarkM<br>
</blockquote></div><br></div></body></html>