<br><br>On Sunday, October 13, 2013, Benjamin (Inglor) Gruenbaum  wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><span style="font-family:arial,sans-serif;font-size:12.800000190734863px">This sort of decoration is nice and it's how I usually do this right now, but this requires me to wrap every array with an `XArray` call which is tedious, </span></div>
<div dir="ltr"><span style="font-family:arial,sans-serif;font-size:12.800000190734863px"></span></div></blockquote><div><br></div><div><div>What do you mean by wrap? Using this looks like:</div><div><br></div><div>let values = new XArray(1,2,3,4);</div>
<div><br></div><div>values.contains(3); // this is the custom "contains"</div></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">
<span style="font-family:arial,sans-serif;font-size:12.800000190734863px">not to mention stuff like `.map` or `.reduce` would still return an Array </span></div><div dir="ltr"><span style="font-family:arial,sans-serif;font-size:12.800000190734863px"></span></div>
</blockquote><div><br></div><div><div>That's incorrect. XArray.prototype.map would return an XArray instance and reduce always returns what you specify it to return, which can be anything.</div><div><br></div><div><br>
</div><div>Rick</div></div><div><span></span> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><span style="font-family:arial,sans-serif;font-size:12.800000190734863px">which would result in more endless wrapping.</span><br>


<div class="gmail_extra"><br><br><div class="gmail_quote">On Sun, Oct 13, 2013 at 11:53 PM, Rick Waldron <span dir="ltr"><<a href="javascript:_e({}, 'cvml', 'waldron.rick@gmail.com');" target="_blank">waldron.rick@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"><br><div class="gmail_extra"><br><br><div class="gmail_quote"><div>On Sun, Oct 13, 2013 at 2:00 PM, Benjamin (Inglor) Gruenbaum <span dir="ltr"><<a href="javascript:_e({}, 'cvml', 'inglor@gmail.com');" target="_blank">inglor@gmail.com</a>></span> wrote:<br>




<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><div><span name="Brendan Eich" style="font-size:12.800000190734863px;font-family:arial,sans-serif">Brendan Eich</span><span style="font-family:arial,sans-serif;font-size:12.800000190734863px;white-space:nowrap"> </span><span style="font-family:arial,sans-serif;font-size:12.800000190734863px;white-space:nowrap"><<a href="javascript:_e({}, 'cvml', 'brendan@mozilla.com');" target="_blank">brendan@mozilla.com</a>> wrote:</span><br>






> <span style="font-family:arial,sans-serif;font-size:12.800000190734863px">No, object detection, polyfilling, and even "prollyfilling" are common and successful adaptationsp on the Web.</span><br style="font-family:arial,sans-serif;font-size:12.800000190734863px">






<div><span style="font-family:arial,sans-serif;font-size:12.800000190734863px"><br></span></div></div><div><span style="font-family:arial,sans-serif;font-size:12.800000190734863px">Polyfilling is great _after_ the method has already been added to the spec. I'm completely fine with adding an Array.prototype.map shim to IE8, the problem with adding a method that's not on the prototype yet is that it'll fail in case the spec is different from the implementation I chose. If you mentioned PrototypeJS, its `.bind` method is one such example.<br>






<br>> </span><span style="font-family:arial,sans-serif;font-size:12.800000190734863px">Your subject recalls a defunct proposal to add lexically-scoped but heap-based -- therefore object property-lookup performance hindering -- extension properties.</span><span style="font-family:arial,sans-serif;font-size:12.800000190734863px"> <br>






<br>I have to say this surprises me, a performance issue is the last thing I expected. What about attaching a prototype as a closure variable, something (and this is a syntax I __don't__ like) like:<br>```<br>(function(use Array){<br>






    Array.prototype.contains = function() { ...<br>    ...<br>    // any code here has access to .contains, code that did not originate here does not have such access, much like a closure.<br>    // other code is free to use Array without any collisions. <br>






})()<br>```</span></div></div></blockquote><div><br></div></div><div>Another solution is creating your own subclass with custom methods...</div><div><br></div><div><br></div><div>class XArray extends Array {</div><div>   constructor(...args) {</div>




<div>     super(...args);</div><div>   }</div><div>   contains(arg) { ... }</div><div>}</div><div><br></div><div><br></div><div>Then all code in this application uses XArray and gets its custom "contains"</div>


<span><font color="#888888">
<div>
<br></div><div><br></div><div>Rick</div><div> </div></font></span></div></div></div>
</blockquote></div><br></div></div>
</blockquote>