On Thu, Sep 9, 2010 at 11:31 PM, David Herman <span dir="ltr">&lt;<a href="mailto:dherman@mozilla.com">dherman@mozilla.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 class="im">&gt; Also, the duality of Object.create vs Traits.create accommodates traditional vs high integrity quite well -- without AFAICT compromising either.<br>
<br>
</div>It creates a false choice, though (all or nothing).</blockquote><div><br></div><div>It does create a choice. What makes a choice false? The traits library is an open abstraction -- it doesn&#39;t encapsulate anything; it only provides some conveniences for sets of choices that seem to go together. It doesn&#39;t preclude others from making other choices, or from providing further abstractions for making those choices convenient.</div>
<div><br></div><div>Of course, that doesn&#39;t mean we&#39;ve chosen the right set of knobs. A better set of knobs would be great. But, IMO, simply having more knobs wouldn&#39;t be.</div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
 IIUC, with Object.create, you don&#39;t even get the conflict checking. And then you&#39;ve really lost the key benefit of traits.<br></blockquote><div><br></div><div>See &lt;<a href="http://code.google.com/p/es-lab/source/browse/trunk/src/traits/traits.js#150">http://code.google.com/p/es-lab/source/browse/trunk/src/traits/traits.js#150</a>&gt;. Even with Object.create, you still get conflict detection, but with failure postponed from creation to usage. This is a more traditionally JavaScripty way to report failure anyway.</div>
<div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">I think there&#39;s room for alternatives in the traits space -- for example, something similar wrt trait composition, but that didn&#39;t bind |this| or freeze. That way, you could still integrate traits with the existing prototype system. For example, to compose traits to create an object that you then use as the prototype for a constructor. This would allow for the &quot;vtables&quot; approach and would also give you the ability to specify initialization behavior to invoke on instantiation, which you can&#39;t do with traits.js.<br>
</blockquote></div><div><br></div>Yes you can:<div><br></div><div>    function Point(x, y) {</div><div>      this.x = x;</div><div>      this.y = y;</div><div>    }</div><div>    Point.prototype = Object.create(</div><div>
      SuperPoint.prototype,</div><div>      Trait.compose(.....));</div><div><br></div><div>Is that the kind of usage you had in mind?</div><div><br>-- <br>    Cheers,<br>    --MarkM<br>
</div>