- From: Tab Atkins Jr. <jackalmage@gmail.com>
- Date: Sun, 1 Jun 2014 15:52:38 -0700
- To: Domenic Denicola <domenic@domenicdenicola.com>
- Cc: Anne van Kesteren <annevk@annevk.nl>, public-script-coord <public-script-coord@w3.org>, Joshua Bell <jsbell@chromium.org>, Jungkee Song <jungkee.song@samsung.com>, Yehuda Katz <wycats@gmail.com>, Alex Russell <slightlyoff@google.com>, Jonas Sicking <jonas@sicking.cc>, Jake Archibald <jaffathecake@gmail.com>, Tobie Langel <tobie.langel@gmail.com>, WebApps WG <public-webapps@w3.org>
On Sun, Jun 1, 2014 at 2:19 PM, Domenic Denicola <domenic@domenicdenicola.com> wrote: > From: Tab Atkins Jr. [mailto:jackalmage@gmail.com] >> Using NamedConstructor is identical to doing: >> >> ```js >> class Foo { ... } >> let Bar = Foo; >> // now I can do "new Foo()" or "new Bar()", to the same effect. >> ``` > > Not true, since the constructors take different arguments. Ah right, I forgot that the arguments are different. This effectively makes it a constructor with overrides, where the function you call it with is taken as one of the arguments used for discriminating between overrides. Out of curiosity, would you be okay with it if it was just an override? That is, if "new Response(...)" took either set of arguments for the ... part? It sounds like you would be. > Instead it is equivalent to > > ```js > class Response { > constructor(body, init) { ... } > ... > } > > function RedirectResponse(url, status = 302) { > return new Response(???, ???); > } > RedirectResponse.prototype = Response.prototype; > ``` > >> What invariants are you concerned about? > > In particular, we have that > > ```js > RedirectResponse.prototype.constructor !== RedirectResponse > (new RedirectResponse(...)).constructor !== RedirectResponse > // Also, omitting the `new` does not throw a `TypeError`, like it does for real constructors. > ``` > > and possibly a few others I am forgetting. This is identically a problem with the case I gave, as Bar.prototype.constructor would be Foo, not Bar. It's possible that this is still a problem, it's just not unique to named constructors. ^_^ Since you suggested a static method, that suggests you're fine with Response.Redirect(http://example.com) giving a new Response object, right? It's just the fact that RedirectResponse has a .prototype pointing to Response.prototype that gives you pause? Presumably RedirectResponse being a subtype would also be acceptable, as its .prototype.constructor would be RedirectResponse? ~TJ
Received on Sunday, 1 June 2014 22:53:31 UTC