<div style="font-family:arial,helvetica,sans-serif;font-size:10pt">Actually, looking at this IDL more closely, I see unneeded invariants causing most of the problem. If URLQuery subclasses Map (assuming we make this possible, which we should), it only needs to promise to hand back strings, not take them. The behavior can simply be defined as toString()-ing the contents when calling "getAll()". There's no reason to re-defined anything about Map here or prevent the normal Map methods from taking any/any as key/value pairs. That URLQuery might, in normal usage, behave this way is a decision for users of the API.<div class="gmail_extra">

<br><br><div class="gmail_quote">On Tue, Nov 20, 2012 at 10:04 AM, Alex Russell <span dir="ltr"><<a href="mailto:alex@dojotoolkit.org" target="_blank">alex@dojotoolkit.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div class="HOEnZb"><div class="h5"><br>
On Nov 19, 2012, at 11:16 PM, "Tab Atkins Jr." <<a href="mailto:jackalmage@gmail.com">jackalmage@gmail.com</a>> wrote:<br>
<br>
> For several things in the DOM and related APIs, we want objects that<br>
> are more-or-less the same as some basic ES stuff, like Arrays or Maps,<br>
> and which are appropriate to treat as those objects in a generic<br>
> manner.<br>
><br>
> For example, the URLQuery interface in the URL Standard<br>
> <<a href="http://url.spec.whatwg.org/#interface-urlquery" target="_blank">http://url.spec.whatwg.org/#interface-urlquery</a>>, which represents the<br>
> query portion (key/value pairs) of a URL, is basically a Map.  (It's<br>
> missing a few pieces right now, like has() and the iterator-producing<br>
> functions, but Anne plans to add them.)<br>
><br>
> Ideally, an author could take a library with generic Map-manipulating<br>
> functions, pass a URLQuery object in, and have a reasonable chance of<br>
> having that just succeed.  Hopefully, this should be robust to common<br>
> type-checking operations, like doing a structural test, or an<br>
> instanceof test.<br>
><br>
> Naively, this is doable just by subclassing Map (in the standard proto<br>
> way), and overriding the methods, to delegate to the Map methods and<br>
> then do additional things.  AWB posted some code to WHATWG detailing<br>
> how you would do this in ES5 and ES6; it's predictably simple.<br>
><br>
> However, URLQuery has some invariants it needs to maintain: it's a<br>
> String->String map, not Any->Any.  As such, it probably doesn't want<br>
> to actually initialize itself as a Map and forward to the Map methods;<br>
> instead, it should probably maintain a hidden internal Map and control<br>
> the access to that itself, so it can ensure that no non-Strings leak<br>
> into the map.<br>
><br>
> If we did this, the only reason to continue subclassing Map is to get<br>
> instanceof checks to work.  Is this acceptable?  Are there better<br>
> ways, perhaps on the horizon?  Any other thoughts?<br>
><br>
> (Further examples: NodeList being an Array, URLFragments being an<br>
> Array, a few DOM->CSS bridges being Maps...)<br>
<br>
<br>
</div></div>You can preserve all of those invariants + instanceof checking with proxies, or a subclass that simply over-writes the set methods to blow up on on-strike key/value setting. Either way, it doesn't seem particularly difficult and doesn't, to my mind, reduce the utility of having actual JS-native types as the baseline from which we design/subclass over in DOM.<br>


<br>
--<br>
Alex Russell<br>
<a href="mailto:slightlyoff@google.com">slightlyoff@google.com</a><br>
<a href="mailto:slightlyoff@chromium.org">slightlyoff@chromium.org</a><br>
<a href="mailto:alex@dojotoolkit.org">alex@dojotoolkit.org</a> BE03 E88D EABB 2116 CC49 8259 CF78 E242 59C3 9723<br>
<div class="HOEnZb"><div class="h5"><br>
_______________________________________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
</div></div></blockquote></div><br></div></div>