Jussi Kalliokoski (2014-06-13T19:07:36.000Z)
domenic at domenicdenicola.com (2014-06-20T19:42:30.748Z)
On Fri, Jun 13, 2014 at 8:21 PM, Allen Wirfs-Brock <allen at wirfs-brock.com> wrote: > If [[Construct]] was eliminated that reason would go away and there would > be no need for the "new Foo(...) built-in specifications. Yes, please. The whole concept of [[Construct]] is just very confusing in my opinion, and makes especially little sense from the userland perspective. For a userland function, it's practically impossible to statically analyze whether that function is a constructor or not, consider these for example: https://gist.github.com/jussi-kalliokoski/7f86ff181a01c671d047 . Which of them are constructors and which are not? And how can you tell? IsConstructor would have to say `true` for every JS-defined function out there to give even close to usable results, and say `false` only for host-defined functions. If we were to then use IsConstructor anywhere, it would deepen the gap between host objects and native objects even further, which I don't think anyone wants. In JS itself (as it currently is), depending on how you think about it, there either aren't constructors at all or every function is a constructor. > Finally, let's say that for ES6 we eliminate [[Construct]] without adding > @@new. If after some experience we find that @@new is really needed we can > easily add it in a backwards compatible manner. To me this sounds like a very reasonable idea, +100, but of course I'm not too well aware of how widely it's used. One question about @@create though... What would this do: ```js function Foo () {} Foo.prototype[Symbol.create] = null; // ??? // Maybe error out, like currently host objects without [[Construct]]: // TypeError: Foo is not a constructor. new Foo(); ```