<div><div dir="auto">There's several ways proxies can change the result of `in`:</div></div><div dir="auto"><br></div><div dir="auto">- Directly via `handler.has(target, key)` (returns boolean)</div><div dir="auto">- Indirectly via `handler.getOwnPropertyDescriptor(target, key)` (returns existing descriptor or `undefined` if missing)</div><div dir="auto">- Indirectly via `handler.getPrototypeOf(target)' (returns relevant prototype)</div><div dir="auto"><br></div><div dir="auto">The proxy trap `has` is almost a direct substitute for your `Symbol.inObject` in most cases, provided you're okay with keys getting stringified.</div><div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, May 9, 2019 at 17:17 Tom Barrasso <<a href="mailto:tom@barrasso.me">tom@barrasso.me</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div dir="auto">Thanks interesting, I hadn’t realized it was possible to “trap” the in operator using Proxy. I may be wrong, but I don’t think Proxy is capable of operating on the prototype chain. Specifically, I don’t think you can change the behavior of the in operator for all Strings (which I’m sure many would prefer).</div><div dir="auto"><br></div><div dir="auto">If this Symbol were seriously considered I believe it would expand the meaning of the in operator as you’re correct, this is definitely not it’s current intention.</div></div><div dir="auto"><br></div><div dir="auto">Tom</div><div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, May 9, 2019 at 4:39 PM Claude Pache <<a href="mailto:claude.pache@gmail.com" target="_blank">claude.pache@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="auto"></div><div dir="auto"><div dir="ltr"></div><div dir="ltr"><br></div><div dir="ltr"><br>Le 9 mai 2019 à 20:52, Tom Barrasso <<a href="mailto:tom@barrasso.me" target="_blank">tom@barrasso.me</a>> a écrit :<br><br></div><blockquote type="cite"><div dir="ltr"><div dir="ltr"><div class="gmail_default" style="font-family:georgia,serif;font-size:small"><div class="gmail_default" style="color:rgb(80,0,80)">Like <span style="background-color:rgb(245,245,245);color:rgb(51,51,51);font-family:Menlo,Monaco,Consolas,"Courier New",monospace;white-space:pre-wrap">Symbol.hasInstance</span> but for the "in" operator.<br>This symbol would work for both native and user-defined objects.</div><div class="gmail_default" style="color:rgb(80,0,80)"><br></div><div class="gmail_default" style="color:rgb(80,0,80)"><b>*Example implementation*</b> prototyping native object:</div><div class="gmail_default" style="color:rgb(80,0,80)"><br></div><div class="gmail_default" style="color:rgb(80,0,80)"><pre style="white-space:pre-wrap;box-sizing:border-box;font-family:Menlo,Monaco,Consolas,"Courier New",monospace;padding:6.5px;margin-top:0px;margin-bottom:11px;line-height:20px;word-break:break-all;color:rgb(51,51,51);background-color:rgb(245,245,245);border:1px solid rgb(204,204,204);border-radius:4px">```js
String.prototype[Symbol.inObject] =
  function(searchString) {
    return this.includes(searchString)
}
```</pre></div><div class="gmail_default" style="color:rgb(80,0,80)"><br><b>*Example implementation* </b>for user-defined object:</div><div class="gmail_default" style="color:rgb(80,0,80)"><br></div><div class="gmail_default" style="color:rgb(80,0,80)"><pre style="white-space:pre-wrap;box-sizing:border-box;font-family:Menlo,Monaco,Consolas,"Courier New",monospace;padding:6.5px;margin-top:0px;margin-bottom:11px;line-height:20px;word-break:break-all;color:rgb(51,51,51);background-color:rgb(245,245,245);border:1px solid rgb(204,204,204);border-radius:4px">```js
function range(min, max) => ({
    [Symbol.inObject]: (prop) => {
        return (prop >= min && prop <= max)
    }
})
```</pre><br></div><div class="gmail_default" style="color:rgb(80,0,80)"><b>*Example usage*</b>:</div><div class="gmail_default" style="color:rgb(80,0,80)"><br><pre style="white-space:pre-wrap;box-sizing:border-box;font-family:Menlo,Monaco,Consolas,"Courier New",monospace;padding:6.5px;margin-top:0px;margin-bottom:11px;line-height:20px;word-break:break-all;color:rgb(51,51,51);background-color:rgb(245,245,245);border:1px solid rgb(204,204,204);border-radius:4px">```js
("foo" in "food")    // true
(14 in range(1, 25)) // true
```</pre></div></div></div>
</div></blockquote><div><br></div></div><div dir="auto">Those two examples seem to give to the `in` operator a meaning that it was not intended to have. The `in` operator is specifically meant to check whether a given property exists in a given object.<div><br></div><div>Also, there already exists a way to customise the behaviour of the `in` operator, namely by using a Proxy.</div></div><div dir="auto"><div><div><div><br></div></div></div><div>—Claude</div></div></blockquote></div></div>
_______________________________________________<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" rel="noreferrer" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
</blockquote></div></div>-- <br><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature">-----<br><br>Isiah Meadows<br><a href="mailto:contact@isiahmeadows.com" target="_blank">contact@isiahmeadows.com</a><br><a href="http://www.isiahmeadows.com" target="_blank">www.isiahmeadows.com</a></div>