In my own code I tend to do the constructor/executor pattern:

```
class A {
  constructor(exec) {
    this.a = 1;
    exec(this);
    Object.freeze(this);
  }
}
class B extends A {
  constructor() {
    super(() => {
      this.b = 2;
    });
  }
}
```

And it works out pretty well.

On Fri, Mar 18, 2016 at 11:25 AM, kdex <[email protected]> wrote:

> Another way that allowed you to use `new` on both base and derived classes
> would be something like this:
>
> ```js
> "use strict";
> function sealInstance(bool) {
>     if (bool) {
>         Object.seal(this);
>     }
> }
> class Base {
>         x = 1;
>         constructor(seal = true) {
>                 sealInstance(seal);
>         }
> }
> class Derived extends Base {
>         y = 2;
>         constructor(seal = true) {
>                 super(false);
>                 sealInstance(seal);
>         }
> }
> let b = new Base(); // Base class can be instantiated with sealing
> let d = new Derived(); // Derived class can be instantiated with sealing
> ```
>
> Not a particular esthetic way, but it doesn't break `new` and transpiles
> without private fields.
> (It will make your constructor signatures a little ugly, though.)
>
>
> On 18.03.2016 16:10, Michael Theriot wrote:
>
> Try this... It will only seal if calling new. The subclasses will still
> need to seal though.
>
> ```js
> class Test {
>   constructor() {
>     this.x = 1;
>     if(new.target === Test) {
>       Object.seal(this);
>     }
>   }
> }
> ```
>
> On Fri, Mar 18, 2016 at 9:57 AM, Brian Barnes <[email protected]> wrote:
>
>> Great, glad to hear that's coming!  I think sealing is a fine solution,
>> it'll do what I want and doesn't cause fits for the engine makers.
>>
>> That said, it has one problem -- base classes.  You can't seal them
>> because the constructor in the extended class would fail (I tried it) and
>> so the base classes would always have to remain  unsealed which means you
>> either (1) understand that or (2) always use an extended class if you care
>> for level of code safety.
>>
>> [>] Brian
>>
>>
>> On 3/18/2016 11:50 AM, kdex wrote:
>>
>>> Brian, Your first example isn't too far from ES2017. Leave away the
>>> `let`s and seal it, and you got:
>>>
>>> ```js
>>> "use strict";
>>> class Test {
>>>      x = 1;
>>>      y = 2;
>>>      constructor() {
>>>          Object.seal(this);
>>>          this.z = 3; // TypeError
>>>      }
>>> }
>>> ```
>>> You can already use this using transpilers (at least babel supports it).
>>>
>>> On 18.03.2016 15:39, Brian Barnes wrote:
>>>
>>>> Ugh, well, I guess I typed a lot of stuff for nothing!  And by the
>>>> look of their experiment, what I wanted was actually one of the major
>>>> blockers.
>>>>
>>>> It seems classes will really need a more standard type of syntax (non
>>>> static) before you could actually achieve this, and might be a bridge
>>>> too far for javascript:
>>>>
>>>> class test
>>>> {
>>>> let x=1;
>>>> let y=2;
>>>> constructor() {}
>>>> func() { this.z=2; }    // syntax error
>>>> }
>>>>
>>>> Though it could be kind of faked by some kind of reverse hoisting,
>>>> i.e., rebuilding the code inside the engine:
>>>>
>>>> class test
>>>> {
>>>> constructor()
>>>> {
>>>> this.x=1;
>>>> this.y=2;
>>>> // stuff that was in the constructor
>>>> Object.seal(this);
>>>> }
>>>> ...
>>>> }
>>>>
>>>> [>] Brian
>>>>
>>>> On 3/18/2016 10:04 AM, Sébastien Doeraene wrote:
>>>>
>>>>> Hi,
>>>>>
>>>>> The Strong Mode experiment was canceled:
>>>>> https://groups.google.com/forum/#!topic/strengthen-js/ojj3TDxbHpQ
>>>>>
>>>>> Cheers,
>>>>> Sébastien
>>>>>
>>>>> On Fri, Mar 18, 2016 at 3:59 PM, kdex < <[email protected]>[email protected]
>>>>> <mailto:[email protected]>> wrote:
>>>>>
>>>>>     Already considered and to be implemented via strong mode IIRC.
>>>>>
>>>>>     On 18.03.2016 14:36, Brian Barnes wrote:
>>>>>
>>>>>         I know properties on classes are getting a look over for the
>>>>>         next iteration (last I checked) and I understand javascript is
>>>>>         obviously a different language then other oo languages with a
>>>>>         different foundation, but I bring this up for it's usage in
>>>>>         producing stricter code that reduces errors and is easier to
>>>>>         analyze.  A vote for this if anybody considered it!
>>>>>
>>>>>         class Test
>>>>>         {
>>>>>
>>>>>         constructor()
>>>>>         {
>>>>>            this.x=1;
>>>>>         }
>>>>>
>>>>>         func1()
>>>>>         {
>>>>>            this.y=2;
>>>>>         }
>>>>>
>>>>>         func2()
>>>>>         {
>>>>>            console.log(this.x+','+this.y);
>>>>>         }
>>>>>         }
>>>>>
>>>>>         var test1=new Test();
>>>>>         test1.func1();
>>>>>         test2.func2(); // outputs 1,2
>>>>>
>>>>>         var test2=new Test();
>>>>>         test2.func(); // outputs 1,undefined
>>>>>
>>>>>         I know classes contents are meant to be in strict mode, and I
>>>>>         thinking that only allowing properties to be created in the
>>>>>         constructor (or eventually static properties on the class
>>>>>         itself) would make a system less prone to the conditions like
>>>>>         you see above.  Basically, func1() would produce a error when
>>>>> run.
>>>>>
>>>>>         I can see why this type of initialization of properties could
>>>>> be
>>>>>         desired, though, especially as it reflect the way it would have
>>>>>         worked if you used a function instead of a class.
>>>>>
>>>>>         [>] Brian
>>>>>         _______________________________________________
>>>>>         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
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> es-discuss mailing list
>>>>> [email protected]
>>>>> https://mail.mozilla.org/listinfo/es-discuss
>>>>>
>>>>> _______________________________________________
>>>> es-discuss mailing list
>>>> [email protected]
>>>> https://mail.mozilla.org/listinfo/es-discuss
>>>>
>>>
>>> _______________________________________________
>>> es-discuss mailing list
>>> [email protected]
>>> https://mail.mozilla.org/listinfo/es-discuss
>>>
>> _______________________________________________
>> es-discuss mailing list
>> [email protected]
>> https://mail.mozilla.org/listinfo/es-discuss
>>
>
>
>
> _______________________________________________
> es-discuss mailing 
> [email protected]https://mail.mozilla.org/listinfo/es-discuss
>
>
>
> _______________________________________________
> es-discuss mailing list
> [email protected]
> https://mail.mozilla.org/listinfo/es-discuss
>
>
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to