On Jun 16, 2014, at 3:02 PM, Jason Orendorff wrote:

> On Fri, Jun 13, 2014 at 5:33 AM, Tom Van Cutsem <tomvc...@gmail.com> wrote:
>> Interesting. It'd be nice if we could further simplify the Proxy/Reflect
>> API. Given the local nature of these changes, we might still include it in
>> ES6 if we achieve quick consensus.
> 
> I'm mostly interested in getting rid of [[Construct]]. Three cheers for that!
> 
> I like @@new better than @@create for three reasons:
> 
> 1. I think it wins on common sense over @@create. "What's this
> Symbol.new thing in this class?" "Oh, whenever you see `new X()`,
> that's shorthand for the @@new method." Pretty straightforward.
> 
> 2. I guess the purpose of @@create, to my mind, was to provide some
> invariants: in particular, an object, once visible to script, is never
> observed to "become" an Array object or "stop being" an Array object.
> Its initialization is hidden in that method. But @@new does that just
> as well or better, it seems to me. "Better" because, well, read on.
> 
> 3. I'm uncomfortable with how all the constructor functions in ES5
> have been rewritten in ES6 to have strange this-value checks and "has
> this value already been initialized? if so, throw" checks.
> Rarely-taken branches are bad for us --- it's a lot of tricky code
> implementers will have to write, test, and optimize, for something
> that should never happen. Providing @@new methods corresponding to the
> ES5 [[Construct]] methods seems more to the point, clearer to specify,
> and easier to implement.
> 

Based upon the above, I don't think I completely misunderstood the semantics 
you have in mind for @@new.  It sounds like you are saying that  a @@new method 
would provide all the legacy "as as a constructor behavior" and that the 
constructor body would provide the legacy "called as a function" behavior.  But 
presumably to enable:
function f(x) {this.x = x}

to do the expected thing the default @@new behavior would have to call into the 
regular body of the function.  In that case, aren't you right back with the 
same problems of trying to  discriminate in a function like f whether it is 
being called independently or called to initialize something created by @@new?

Perhaps you could fill out what you actually mean by @@new and how it would 
work for regular functions, class declarations, and subclasses of both regular 
classes and the legacy built-ins.

Allen
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to