Should I be able to apply `new`?
Graydon Hoare
graydon at mozilla.com
Fri Apr 6 11:50:37 PDT 2007
Brendan Eich wrote:
> On Apr 6, 2007, at 6:53 AM, Jeff Walden wrote:
>
>>> function maker () {
>>> var o = arguments[0].intrinsic::construct.apply(null,
>>> arguments.slice(1));
>>> ...
>>> return o;
>>> }
>> The |null| is purely a guess; I suspect whatever's actually there
>> is ignored.
>
> Couple of updates:
>
> * The hooks for get, set, etc. are in the meta namespace now.
> * We eliminated meta::construct since classes have constructor syntax
> already, and functions are a single special case.
> * There remain unaddressed use-cases for applyNew or whatever you'd
> call it (Narcissus calls it __applyConstructor__).
Hold on, he didn't say meta::construct, he said intrinsic::construct.
Eliminating meta::construct is different from eliminating
intrinsic::construct. The former was the proposed hook for a class to
override the standard constructor protocol, in rare cases where you want
to eg. memoize instances rather than allocate new ones.
We decided that's rare enough and confusing enough not to support
meta::construct; it's easy enough to provide meta::invoke and tell your
clients to call myClass(...) for such cases, rather than "new
myClass(...)". We agreed that operator 'new' will always allocate and
always run the standard construction protocol (inits, settings, ctors,
in their base/derived nesting order). I don't have a strong opinion for
or against this position, but it's what the committee concluded at the
last meeting.
The latter -- intrinsic::construct -- is a function the runtime provides
to let user code *apply* the standard construction protocol -- as in
operator 'new' -- to a class and an arguments array. Just as
Function.apply applies the standard calling protocol to a function and
an arguments array. IMO we should be providing intrinsic::construct.
It's in the reference impl at the moment.
-graydon
More information about the Es4-discuss
mailing list