super.apply(this, arguments)
Graydon Hoare
graydon at mozilla.com
Thu Dec 20 11:24:54 PST 2007
Peter Hall wrote:
> I haven't tried this in the RI, but what about:
>
> var sup = super;
> sup.apply(this, arguments);
No, the problem arises from two separate facts:
- constructor invocation is not a function call
- super-constructor chaining is not a function call either
Both of these are different operations with different semantics. We have
a way of getting a function for the former (using the reflection API)
such that you can run a constructor with variable args using apply. We
do not have a way of getting a function for the latter, and really
should not. Super-constructor chaining occurs only in a special, limited
syntactic and semantic context: the end of the settings list, before the
constructor body is entered. There's no reasonable interpretation of a
first class escaping function that does this, as the context in which
the function even makes sense vanishes as soon as the constructor body
is entered. This is why we currently just use an explicit super-expression.
However, I think we can all see a nice symmetry argument that it would
be nice to have an additional form for passing variable arguments up to
your super-constructor. I'd imagine lots of possibilities might work, so
long as they're unambiguous:
function myObj(...args)
: super.apply(args) // a pseudo-property?
{}
function myObj(...args)
: super_apply(args) // a pseudo-global?
{}
function myObj(...args)
: super_arguments = args // a pseudo-local?
{}
I suspect the first will turn the least number of stomachs, and is
probably ok if we prohibit all *other* super-property accesses in the
settings list. This seems plausible to me given that the first-class
super rvalue hasn't even been initialized by the time the settings run,
only allocated.
-Graydon
More information about the Es4-discuss
mailing list