<div dir="ltr">After thinking this over, I still remain unconvinced that symbols are the right solution to the problem.  Besides the fact that they introduce (ever more) complexity to the object model, they simply do not work as a duck-typing strategy for the real, *multi-realm* world of Javascript.  Sure, we can make a special case of standard library symbols such that they maintain identity across realms.  But a solution which only works for special cases isn't a very good solution, is it?<div>
<br></div><div>Here is another proposal which avoids these pitfalls:</div><div><br></div><div>1) Identify all meta-layer hooks using a string that is not an identifier.  The actual string used doesn't matter in this proposal, but for illustration purposes I'll use an "@"-prefix.</div>
<div><br></div><div>2) Define all meta-layer hooks as functions.  Testing for the hook will involve [[Get]] followed by [[IsCallable]].</div><div><br></div><div>For example, defining an iterable:</div><div><br></div><div>
    class C { "@iterator"(...args) { /* ... */ } }</div><div><br></div><div> Overriding the string tag:</div><div><br></div><div>    class C { "@toStringTag"() { return "[object C]"; } }</div>
<div><br></div><div>- Since the property name is a non-identifer, it is unlikely to collide with any object members.</div><div>- Since the value of the hook must be a function, it is unlikely to collide with keys in an object-as-map (e.g. a JSON object).</div>
<div>- Since it is just a string, it requires no changes to property semantics, and it trivially works across realms.</div><div><br></div><div>{ Kevin }</div><div><br></div></div>