- From: François REMY <francois.remy.dev@outlook.com>
- Date: Mon, 2 Dec 2013 23:43:00 +0100
- To: "'Boris Zbarsky'" <bzbarsky@MIT.EDU>, <www-dom@w3.org>
- CC: "'Domenic Denicola'" <domenic@domenicdenicola.com>, "'Tab Atkins Jr.'" <jackalmage@gmail.com>
± > I guess it would not be a constructor in that case though, i.e. you'd do `var
± > myH1 = HTML.h1()` instead of `var myH1 = new HTML.h1()`, since otherwise
± > you would break the `new X instanceof X` invariant.
±
± This invariant is already broken when x is Image or Option or Audio, fwiw. Or
± any other case that uses WebIDL's NamedConstructor....
This isn't true, at least in IE and FireFox.
1) new Image() instanceof Image == true
2) new Image() instanceof HTMLImageElement == true
3) document.createElement('img') instanceof Image == true
4) document.createElement('img') instanceof HTMLImageElement == true
5) Image !== HTMLImageElement
However, there's a bug in Chrome where new Image() and document.createElement('img') returns two objects with a different prototype chain (ie: new Image() instanceof Image, new Image() instanceof HTMLImageElement, but document.createElement('img') not-instanceof Image).
This bug means that setting Image.prototype.doSomething has no effect on <img> elements not created via new Image() in Chrome, which is not the case in IE/FireFox.
That being said, I agree that (new X() instanceof X) is not a requirement in JavaScript:
| function xhr() { return new XMLHttpRequest(); }
| new xhr() istanceof xhr == false
± instanceof walks up the proto chain but then looks for the
± .constructor of the things on the proto chain matching the RHS.
As far as I know, this also isn't accurate.
| var T = function T() {}
| T.prototype = HTMLImageElement.prototype
| document.createElement('img') instanceof T == true
And this is true in all browsers. Also:
| function xhr() { return new XMLHttpRequest(); }
| xhr.prototype = XMLHttpRequest.prototype;
| new xhr() istanceof xhr == true
Best regards,
François
Received on Monday, 2 December 2013 22:43:34 UTC