<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><div>On Jun 19, 2012, at 3:20 PM, Erik Arvidsson wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div>On Tue, Jun 19, 2012 at 1:55 PM, David Bruant <<a href="mailto:bruant.d@gmail.com">bruant.d@gmail.com</a>> wrote:<br><blockquote type="cite">Le 19/06/2012 18:21, Erik Arvidsson a écrit :<br></blockquote><blockquote type="cite"><blockquote type="cite">On Tue, Jun 19, 2012 at 6:42 AM, 程劭非 <<a href="mailto:csf178@gmail.com">csf178@gmail.com</a>> wrote:<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">I guess we can try to push Web IDL to do this.<br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">WebIDL provides [ArrayClass] and DOM4 make NodeLists ArrayClass. This<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">means that NodeLists have Array.prototype on its prototype chain.<br></blockquote></blockquote><blockquote type="cite">Excellent! I hadn't heard of that.<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"><blockquote type="cite">We tried to make this change in WebKit but it caused some issues,<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">mostly on sites depending on a bug in Closure Library. The Closure bug<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">has been fixed but the question is how many other sites out there do<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">incorrect detection and therefore assume that anything that is an<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">instance of Array is actually a true Array<br></blockquote></blockquote><blockquote type="cite">I'll guess a quantity between "a lot" and "a ridiculous amount".<br></blockquote><blockquote type="cite">I read "if(something instanceof Array)" very often when view-sourcing<br></blockquote><blockquote type="cite">and they mean "Array.isArray(something)".<br></blockquote><blockquote type="cite">A trickier question is: will this code break the NodeLists inherit from<br></blockquote><blockquote type="cite">Array.prototype and that's harder to answer.<br></blockquote><br>The case that broke was something like this:<br><br>if (x instanceof Array)<br>  realArray.concat(x);<br><br>The problem is that concat behaves different when its argument is a<br>real Array ([[Class]] is "Array").<br><br>I wonder if we could change concat in such a way that it checks the<br>prototype chain too?<br></div></blockquote><div><br></div><div><br></div><div>I touched upon this in #5 of <a href="http://wiki.ecmascript.org/doku.php?id=strawman:es5_internal_nominal_typing">http://wiki.ecmascript.org/doku.php?id=strawman:es5_internal_nominal_typing</a> and in more detail in <a href="https://docs.google.com/document/d/1sSUtri6joyOOh23nVDfMbs1wDS7iDMDUFVVeHeRdSIw/edit?authkey=CI-FopgC">https://docs.google.com/document/d/1sSUtri6joyOOh23nVDfMbs1wDS7iDMDUFVVeHeRdSIw/edit?authkey=CI-FopgC</a> </div><div><br></div><div>Basically the way to fix it is to define a well known private name property that concat uses to determine the kind of target container to instantiate (for example, its value could be the constructor to invoke to create it).</div><div><br></div><div>Then things like NoteList.prototype could have that property defined such as to produce NodeList instances.</div><div><br></div><div>I probably need to write up a short strawman specifically about this. </div><div><br></div><div>Allen</div></div></body></html>