On Sep 18, 2014, at 1:11 PM, Domenic Denicola wrote: > From: es-discuss [mailto:es-discuss-boun...@mozilla.org] On Behalf Of Domenic > Denicola > >> I'm just quoting Allen's gist. It's a base class whose constructor always >> throws (in the gist, by doing `this = undefined`). Almost all DOM classes >> are currently like this, for example. > > Actually, this is a really important point. Since HTMLElement is abstract > (throws on construct in all cases), the *only* way of extending it is by > doing `this = Object.create(new^.prototype)`. You *cannot* extend it with > `this = new super()`, either implicitly or explicitly, since `new super()` > throws. > > So if you want to extend HTMLElement, you will need `this = > Object.create(new^.prototype)`, either implicitly or explicitly. (And I argue > for implicitly.)
But that won't give you a real HTMLElement exotic object, if there is such a thing, and won't initialize it properly. But you can get around that problem if the HTMLElement constructor is defined appropriately using this^: class HTMLElement { constructor(...args) { if (this^ === HTMLElement) then throw new DOMError("can't create using new"); if (this !== undefined) { //assert: must have been called via new super() this = privateAllocatedDOMElement(); //initialize newly allocated DOMElement } } } Allen _______________________________________________ es-discuss mailing list es-discuss@mozilla.org https://mail.mozilla.org/listinfo/es-discuss