<div dir="ltr"><div class="gmail_default" style="font-family:georgia,serif;font-size:small;color:rgb(0,0,0)">It seems like using [[Get]] for looking up `@@hasInstance` can be confusing and requires devs to write extra code. For example, suppose we have the following code:</div><div class="gmail_default" style="font-family:georgia,serif;font-size:small;color:rgb(0,0,0)"><br></div><div class="gmail_default" style="font-family:georgia,serif;font-size:small;color:rgb(0,0,0)">```js</div><div class="gmail_default" style=""><div class="gmail_default" style=""><font color="#000000" face="georgia, serif">class A {</font></div><div class="gmail_default" style=""><font color="#000000" face="georgia, serif">    static [Symbol.hasInstance] (obj) {</font></div><div class="gmail_default" style=""><font color="#000000" face="georgia, serif">        return false</font></div><div class="gmail_default" style=""><font color="#000000" face="georgia, serif">    }</font></div><div class="gmail_default" style=""><font color="#000000" face="georgia, serif">}</font></div><div class="gmail_default" style=""><font color="#000000" face="georgia, serif"><br></font></div><div class="gmail_default" style=""><font color="#000000" face="georgia, serif">class B extends A {}</font></div><div class="gmail_default" style=""><font color="#000000" face="georgia, serif">class C extends B {}</font></div><div class="gmail_default" style=""><font color="#000000" face="georgia, serif"><br></font></div><div class="gmail_default" style=""><font color="#000000" face="georgia, serif">let c = new C</font></div><div class="gmail_default" style=""><br></div><div class="gmail_default" style=""><font color="#000000" face="georgia, serif">console.log(c instanceof B) // false, but expected true!</font></div><div class="gmail_default" style=""><font color="#000000" face="georgia, serif">console.log(c instanceof A) // false, as expected</font></div><div style="color:rgb(0,0,0);font-family:georgia,serif;font-size:small">```</div><div style="color:rgb(0,0,0);font-family:georgia,serif;font-size:small"><br></div><div style="color:rgb(0,0,0);font-family:georgia,serif;font-size:small">The `c instanceof B` check (arguably unintuitively) fails. Defining a `Symbol.hasInstance` method on a base class causes `instanceof` checks on any subclasses to automatically fail unless the developer takes care to write an ugly and fragile workaround:</div><div style="color:rgb(0,0,0);font-family:georgia,serif;font-size:small"><br></div><div style=""><div class="gmail_default" style="color:rgb(0,0,0);font-family:georgia,serif;font-size:small">```js</div><div class="gmail_default" style=""><div class="gmail_default" style=""><font color="#000000" face="georgia, serif">class A {</font></div><div class="gmail_default" style=""><font color="#000000" face="georgia, serif">    static [Symbol.hasInstance](obj) {</font></div><div class="gmail_default" style=""><font color="#000000" face="georgia, serif">        if (this === A) return false</font></div><div class="gmail_default" style=""><font color="#000000" face="georgia, serif">        else return Function.prototype[Symbol.hasInstance].call(this, obj)</font></div><div class="gmail_default" style=""><font color="#000000" face="georgia, serif">    }</font></div><div class="gmail_default" style=""><font color="#000000" face="georgia, serif">}</font></div><div class="gmail_default" style=""><font color="#000000" face="georgia, serif"><br></font></div><div class="gmail_default" style=""><font color="#000000" face="georgia, serif">class B extends A {}</font></div><div class="gmail_default" style=""><font color="#000000" face="georgia, serif">class C extends B {}</font></div><div class="gmail_default" style=""><font color="#000000" face="georgia, serif"><br></font></div><div class="gmail_default" style=""><font color="#000000" face="georgia, serif">let c = new C</font></div><div class="gmail_default" style=""><font color="#000000" face="georgia, serif"><br></font></div><div class="gmail_default" style=""><font color="#000000" face="georgia, serif">console.log(c instanceof B) // true, as expected</font></div><div class="gmail_default" style=""><font color="#000000" face="georgia, serif">console.log(c instanceof A) // false, as expected</font></div><div class="gmail_default" style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small"><span style="color:rgb(0,0,0);font-family:georgia,serif">```</span><br></div><div style="color:rgb(0,0,0);font-family:georgia,serif;font-size:small"><br></div><div style="color:rgb(0,0,0);font-family:georgia,serif;font-size:small">That seems likely to introduce errors or headaches.</div><div style="color:rgb(0,0,0);font-family:georgia,serif;font-size:small"><br></div><div style="color:rgb(0,0,0);font-family:georgia,serif;font-size:small">What if the lookup for `Symbol.hasInstance` on an object use [[GetOwnProperty]]? Then the first version without the conditional checks would not break subclasses.</div></div></div></div><br clear="all"><div><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><b style="font-size:12.8px">/#<i>!</i>/</b><font face="courier new, monospace" style="font-size:12.8px">JoePea</font><br></div></div></div>
</div>