Maciej Stachowiak wrote: > On Sep 27, 2009, at 11:14 AM, Brendan Eich wrote: >> On Sep 27, 2009, at 10:41 AM, David-Sarah Hopwood wrote: >>> Brendan Eich wrote: >>>> On Sep 26, 2009, at 6:08 PM, Maciej Stachowiak wrote: >>>> >>>>> This may provide a way to implement some of these behaviors in pure >>>>> ECMAScript. The current proposal does allow [[Construct]] without >>>>> [[Call]], but not [[Call]] and [[Construct]] that both exist but with >>>>> different behavior. >>>> >>>> Date needs the latter. >>> >>> That can already be done in ES5. As I've previously suggested: >>> >>> function Date(yearOrValue, month, date, hours, minutes, seconds, ms) { >>> "use strict"; >>> if (this === undefined) { >>> return TimeToString(CurrentTime()); >>> } >>> // constructor behaviour >>> ... >>> } >> >> Of course, a variation on "the idiom". >> >> This is similar to what many implementations do too, rather than the >> implementation providing analogues of [[Call]] and [[Construct]] >> internal method on a non-function Date object. It works for Boolean, >> Number, String, and RegExp too. >> >> But it is just a bit unsightly! > > Will this do the right thing if you explicitly bind Date to a "this" > value, for example, by calling it as window.Date(), or using call, > apply, or function.bind, or by storing Date as the property of another > random object?
Now that I think about it, probably not (it will attempt to set the [[Class]] of 'this' to "Date", which is unsafe). But the problem here isn't introduced by the fact that [[Call]] and [[Construct]] have different behaviour: none of the other built-in constructors can be safely expressed in ES5 for the same reason, regardless of their [[Call]] behaviour. -- David-Sarah Hopwood ⚥ http://davidsarah.livejournal.com _______________________________________________ es-discuss mailing list es-discuss@mozilla.org https://mail.mozilla.org/listinfo/es-discuss