<div dir="ltr"><div><div><div><div>You really don't <i>want</i> proxies to equal their underlying objects:  proxies can show properties that the underlying object doesn't have, hide properties that the underlying object does have, alter the appearance of other proxies, etc.<br><br></div>What you probably want is to never deal with the underlying object in the first place, unless you absolutely have to.  That's why you'd create a proxy anyway...<br><br></div>Have you heard about membranes?  I've talked about them on this list recently, as have several others over the years...<br><br></div>I don't intend to toot my own horn too much, but you might want to check out my es7-membrane project:<br><a href="https://github.com/ajvincent/es7-membrane/">https://github.com/ajvincent/es7-membrane/</a><br><br></div>Alex<br><div><div><div><div><div><div class="gmail_extra"><br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">From: Michael Lewis <<a href="mailto:mike@lew42.com">mike@lew42.com</a>><br>To: <a href="mailto:es-discuss@mozilla.org">es-discuss@mozilla.org</a><br>Cc: <br>Bcc: <br>Date: Thu, 30 Mar 2017 13:50:07 -0500<br>Subject: Proxies fail comparison operator<br><div dir="ltr">Hello community,<div><br></div><div>The proxy is almost an<i> </i>identical to the underlying object, but it<b> fails a comparison check with the underlying object.</b></div><div><br></div><div>This means that if anyone gets a reference to the underlying object before it is proxied, then we have a problem.  For example:</div><div><br></div><div><table class="gmail-m_-5366310930309277052gmail-highlight gmail-m_-5366310930309277052gmail-tab-size gmail-m_-5366310930309277052gmail-js-file-line-container" style="box-sizing:border-box;border-collapse:collapse;color:rgb(36,41,46);font-family:-apple-system,blinkmacsystemfont,"segoe ui",helvetica,arial,sans-serif,"apple color emoji","segoe ui emoji","segoe ui symbol";font-size:14px"><tbody style="box-sizing:border-box"><tr style="box-sizing:border-box"><td id="gmail-m_-5366310930309277052gmail-file-gistfile1-js-LC1" class="gmail-m_-5366310930309277052gmail-blob-code gmail-m_-5366310930309277052gmail-blob-code-inner gmail-m_-5366310930309277052gmail-js-file-line" style="box-sizing:border-box;padding:0px 10px;line-height:20px;vertical-align:top;overflow:visible;font-family:sfmono-regular,consolas,"liberation mono",menlo,courier,monospace;font-size:12px;white-space:pre-wrap"><span class="gmail-m_-5366310930309277052gmail-pl-k" style="box-sizing:border-box;color:rgb(167,29,93)">var</span> obj <span class="gmail-m_-5366310930309277052gmail-pl-k" style="box-sizing:border-box;color:rgb(167,29,93)">=</span> {};</td></tr><tr style="box-sizing:border-box"><td id="gmail-m_-5366310930309277052gmail-file-gistfile1-js-LC2" class="gmail-m_-5366310930309277052gmail-blob-code gmail-m_-5366310930309277052gmail-blob-code-inner gmail-m_-5366310930309277052gmail-js-file-line" style="box-sizing:border-box;padding:0px 10px;line-height:20px;vertical-align:top;overflow:visible;font-family:sfmono-regular,consolas,"liberation mono",menlo,courier,monospace;font-size:12px;white-space:pre-wrap"><span class="gmail-m_-5366310930309277052gmail-pl-k" style="box-sizing:border-box;color:rgb(167,29,93)">var</span> proxy <span class="gmail-m_-5366310930309277052gmail-pl-k" style="box-sizing:border-box;color:rgb(167,29,93)">=</span> <span class="gmail-m_-5366310930309277052gmail-pl-k" style="box-sizing:border-box;color:rgb(167,29,93)">new</span> <span class="gmail-m_-5366310930309277052gmail-pl-en" style="box-sizing:border-box;color:rgb(121,93,163)">Proxy</span>(obj, {});</td></tr><tr style="box-sizing:border-box"><td id="gmail-m_-5366310930309277052gmail-file-gistfile1-js-LC3" class="gmail-m_-5366310930309277052gmail-blob-code gmail-m_-5366310930309277052gmail-blob-code-inner gmail-m_-5366310930309277052gmail-js-file-line" style="box-sizing:border-box;padding:0px 10px;line-height:20px;vertical-align:top;overflow:visible;font-family:sfmono-regular,consolas,"liberation mono",menlo,courier,monospace;font-size:12px;white-space:pre-wrap">obj <span class="gmail-m_-5366310930309277052gmail-pl-k" style="box-sizing:border-box;color:rgb(167,29,93)">==</span> proxy; <span class="gmail-m_-5366310930309277052gmail-pl-c" style="box-sizing:border-box;color:rgb(150,152,150)"><span class="gmail-m_-5366310930309277052gmail-pl-c" style="box-sizing:border-box">//</span> false</span></td></tr></tbody></table></div><div><br></div><div><b>Isn't the purpose of the proxy to be exchanged with the original</b><b>, without any negative side effects?  </b>Maybe that's not the intended use case, but it's a useful one.  And, besides the comparison, I can't think of any other "negative side effects".</div><div><b><br></b></div><div>It seems like the Proxy could have a <b>comparison trap</b>.  The comparison could pass by default, and you could use the trap if you wanted to make `proxy == obj` fail.</div><div><br></div><div>Also, a slight tangent: it would be awesome if you could <b>skip debugging proxy traps when stepping through code.  </b>When you proxy both `get` and `apply` for all objects/methods, you have 10x the work when trying to step through your code.</div><div><br></div><div>I just subscribed to this list.  Is this an appropriate venue for this type of inquiry?  I appreciate any feedback.</div><div><br></div><div><br></div><div><br></div><div>Thanks!</div><div><br></div><div>Michael</div></div></blockquote></div><br></div></div></div></div></div></div></div>