On May 19, 2011, at 11:02 AM, Bob Nystrom wrote:

> On Thu, May 19, 2011 at 10:50 AM, Brendan Eich <bren...@mozilla.com> wrote:
> Don't take this the wrong way ;-), but how many of those initializations were 
> immediately overwritten by the constructor, unconditionally or even 
> conditionally?
> 
> Heh, zero, actually. We're pretty scrupulous here. The 34 examples fell 
> roughly into these buckets:
> 
> 1. State that just always started a certain way: this.checked = false;
> 2. Collections that are mutated, but never assigned: this.items = [];
> 3. Objects used to compose a larger one: this.myButton = new Button("label");
> 
> If it was ever assigned to in the ctor using state passed in, or in a control 
> flow path that was dependent on ctor arguments (or this), I didn't count it 
> in the 34.

Thanks for measuring, helpful beyond our qualitative arguments.

Here's another question: how many property initializations could be done 
straight from the parameter of the same name?

And here's the punchline: we are forgetting about parameter default values:

http://wiki.ecmascript.org/doku.php?id=harmony:parameter_default_values

Apart from the desire to declare per-instance property names, do we really need 
default values if the constructor author could write default parameter values?

class Point {
  constructor(x = 0, y = 0) {
    this.x = x;
    this.y = y;
  }
 ...
}


Now, Scala and CoffeeScript fans will object to repeating x and y three times. 
IIRC an earlier proposal even allowed for the concise syntax

class Point {
  constructor(this.x = 0, this.y = 0) {
  }
 ...
}

The CoffeeScript syntax is even sweeter:

class Point {
  constructor(@x = 0, @y = 0);
 ...
}

The objection here is that @ is coveted, for private names or decorators.

Perhaps we could use leading dot in formal parameter names to mean this.:

class Point {
  constructor(.x = 0, .y = 0);
 ...
}

Comments welcome!


>> 4. It's terse:
>> 
>> class Stack {
>>   public items;
>>   constructor() {
>>     this.items = [];
>>   }
>>   ...
>> }
>> 
>> class Stack {
>>   public items = [];
>>   ...
>> }
> 
> You'd need a fresh [] evaluation per construction. Mark pointed out how this 
> seems to change the evaluation rules for the immediate elements of the class 
> body. Not fatal but another kind of inconsistency, along a different 
> dimension.
> 
> I agree, this part feels a little weird. The fact that we're doing anything 
> per-instance in the class body is probably the strangest part of this 
> proposal since the other two objects touched by the class body (the ctor 
> object and the prototype) are both singletons. Even declaring per-instance 
> properties there feels a little strange, but I think it's generally worth 
> that inelegance. <shrug>

See if my parameter default value pitch does not provide a better alternative.

/be

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

Reply via email to