Allen Wirfs-Brock allen at
Fri Jun 13 10:21:12 PDT 2014

On Jun 13, 2014, at 8:05 AM, C. Scott Ananian wrote:

> On Fri, Jun 13, 2014 at 6:33 AM, Tom Van Cutsem < at> wrote:
>> Jason proposes:
>>    new C(...args) => C[](...args)
>> Allen proposes:
>>   new C(...args) =>  C.apply(C[Symbol.create](), args)
> Consider also the way the spec could read.  For example, for the
> 'Error' object, instead of having " Error ( message )" and
> " new Error ( ...argumentsList )", in Jason's formulation
> section would just be "Error[ @@new ]]", aka an ordinary
> method definition.  "If Error is implemented as an ECMAScript function
> object, its inherited implementation of @@new will perform the above
> steps."

The existence or not of @@new doesn't make a difference in that regard.  The only reason we current need the "new Foo(...)" specifications is because [[Construct]] exists and built-ins are not necessarily ECMAScript functions so we have to say what their [[Construct]] behavior is.

If [[Construct]] was eliminated that reason would go away and there would be no need for the "new Foo(...) built-in specifications. 

The only difference between inlining ordinary [[Construct]] into the 'new' operator semantics and defining the 'new' operator as invoking @@new is the amount of freedom anES programmer would have in defining how a @@create method relates to its companion  constructor function. Without @@new there is a fixed protocol for how @@create and the constructor function are invoked relative to each other.  With @@new a different protocol (including ones that completely ignores @@create and the constructor function) could be implemented in ES code. 

It isn't clear if there are really any use cases that could be supported by @@new that couldn't also be support by carefully crafting a @@create and companion constructor function. 

Anotherconcern I have with @@new, it that it exposes two extension points, @@new and @@create, on very constructor.  I'm afraid that it wouldn't be very clear to most ES programmers when you should over-ride one or the other.  

Finally, let's say that for ES6 we eliminate [[Construct]] without adding @@new. If after some experience we find that @@new is really needed we can easily add it in a backwards compatible manner. 


More information about the es-discuss mailing list