[[Call]] and [[Construct]]

David-Sarah Hopwood david-sarah at jacaranda.org
Sun Sep 27 16:19:30 PDT 2009


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



More information about the es-discuss mailing list