On 6/10/15 1:46 PM, Mark Miller wrote:
On Wed, Jun 10, 2015 at 8:59 AM, Jeff Morrison <[email protected] <mailto:[email protected]>> wrote:


    Instead, the purpose of initializers outside of the constructor
    are to increase expressivity in a different sense than what I
    think you meant about constructor initialization: It allows
    initialization that isn't based on logic in the constructor to be
    visually and clearly separate from logic that is.


So let's put a visually distinct syntax *in* the constructor. The constructor is no longer as-if a function in several ways already. In for a penny, in for a pound.
This might work too, but it forgoes the benefits of not having to override a parent constructor just to initialize child-class-specific properties. Writing the initializers at the class's toplevel also seemed more familiar (considering cow paths in JS as well as other langs) to provide this syntax outside of the constructor, though.

Do you have a proposal for something that would be clearly declarative and clearly set the initialization apart from any logic in the constructor?


    It is strictly less expressive for constructor-injected state
    patterns,



In case I was not clear, I am not for using the current assignment-in-constructor to pun initializing in constructor, the way Java does. Initialization and assignment should be distinct. Const private instance fields must be initialized but must not be assigned to.
I have a fuzzy idea of what I think you mean, but mind clarifying with a code example of what you're not interested in vs what you are?

    but it is strictly more expressive for other patterns of
    initialization.


What do you have in mind?
Yehuda had some examples for Ember somewhere, but one place where React would like this is shown here:
http://facebook.github.io/react/blog/2015/01/27/react-v0.13.0-beta-1.html#es7-property-initializers

In this case, React is using classes as a declarative form to describe a component which doesn't take all of it's parameters via constructor injection. The constructor is handled by the base class, and it would be stricly boilerplate to have to write `constructor(props, context) { super(props, context); this.state = [...] }` each time one writes a child class.

Instead, the component writer describes the initial `state` property with a property initializer on the class and is able to avoid the class constructor altogether. The framework coordinates instantiation of the component class without having to also plumb non-framework-provided data through to the instantiation as well (and the child gets to avoid the boilerplate and potential user-error hazards of overriding the constructor + the ceremony of calling super(), etc).

Another simple example is one where a class defines the structure of some objects that should acquire some GUID property without imposing the need to write out a full parent constructor override:

```
var guidCounter = 1;
function getGuid() { return guidCounter++; }
class MyThing { id = getGuid(); }
new MyThing().id; // 1
new MyThing().id; // 2
```


    I'm wary of adding syntax whose primary motivation is to express
    type constraints, when we haven't even defined (or proposed) what
    typing in JS means.



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


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




--
Text by me above is hereby placed in the public domain

  Cheers,
  --MarkM

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

Reply via email to