On Mar 24, 2012, at 11:45 PM, David Herman wrote:

> On Mar 24, 2012, at 5:54 PM, Allen Wirfs-Brock wrote:
> 
>> ...
> 
>>>   a) spell it "new" -- ergonomics trumps corner cases; hard cases make bad 
>>> law
>> deviates from chapters 13 and 15.  
>> 
>> (class () {})  isn't interchangeable with (function () {}). Shouldn't it be?
> 
> When I say "spell it 'new'" I mean "the *surface syntax* is spelled 'new'". 
> That has nothing to do with the semantics. The semantics is described in 
> point b). Keep reading...

Ah, I was interpreting your a-d as 4 alternative semantics rather than as a 
sequence defining a single semantics.
> 
>>>   b) desugar it to the constructor function and the p.constructor property 
>>> only
>> 
>> but presumably means that an instance method named new can't be defined 
>> using a class definition.
> 
> Not with the declarative syntax, no. But easily enough imperatively:
> 
>    class C { new(x) { this.x = x } } // defines C.prototype.constructor === C
>    C.prototype.new = function() { console.log("I am C's 'new' method") }

or
   class C{
       new() {this.x=x}
       "new"(){console.logn("I am C's 'new; method")}
   }

(not to say that I particularly like the above, but it would work according to 
the current strawman.)
> ...
> 
> My proposal is not, and has never been, to change the C.prototype.constructor 
> idiom. It is to choose a different surface syntax that desugars to *exactly* 
> the classic idiom.

Got it.

I'm still not necessarily convinced that giving new that syntactic meaning is 
the best thing to do.  The ES classabstraction is going to be a quite leaky 
abstraction.  Anyone will be able to easily observe that a class object is 
really a constructor function with a prototype property, etc. and this 
knowledge is probably going to needed even by fairly unsophisticated developer. 
 For example it is needed to understand the basic kind of class testings 
(a.constructor === b.constructor) that I mentioned.   My suspicion is that the 
name difference between the syntactic sugar and the underly but highly visible 
implementation will cause some confusion.  It also adds complexity because it 
requires addition static semantic rules regarding the use of new and 
constructor as method names within class declarations.

Finally, regarding:
>> 
>>> 
>>>    d) an explicit 'constructor' method overrides the implicit creation of 
>>> the 'constructor' method but does not define the constructor function
>>> 
>>> Why d)? Remember, the .constructor idiom is a *very weak* idiom that many 
>>> JS programs don't follow. If a JS program has some reason to use 
>>> 'constructor' for a different purpose, trust them.
>> 
>> I believe the constructor idiom is most commonly not followed today when the 
>> prototype property of a function is set to a new object (perhaps defined 
>> using an object literal) and correctly dynamically setting the "constructor" 
>> property is an extra step that is easily forgotten (an usually as no 
>> ill-effects) 

I really don't like d) very much at all.  I think one of the advantages that 
use of class declaration can offer  is a higher integrity implementation of the 
latent ES class model.   In particular, it could more strongly enforce the 
<ctor>.prototype === <ctor>.prototype.constructor invariant.  I don't think a 
class declaration should be allowed to set the prototype's constructor property 
to anything other than the actual class object (ie constructor function). It 
also should make <ctor>.prototype writable:false and configurable: false, just 
like is done for all of the chapter 15 constructors. In addition, I suggest 
that we should go one step further and also make <ctor>.prototype.constructor 
writable:false and configurable: false.  It isn't clear to me why ES1 chapter 
15 made all <ctor>.prototype ReadOnly/DontDelete but didn't do the same for 
chapter 15 <ctor>.prototype.constructor properties.)Allen

Allen


_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to