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] <mailto:[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
                
<https://groups.google.com/forum/#%21topic/strengthen-js/ojj3TDxbHpQ>

                Cheers,
                Sébastien

                On Fri, Mar 18, 2016 at 3:59 PM, kdex <[email protected]
                <mailto:[email protected]>
                <mailto:[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]>
                <mailto:[email protected]
                <mailto:[email protected]>>
                https://mail.mozilla.org/listinfo/es-discuss


                _______________________________________________
                    es-discuss mailing list
                [email protected] <mailto:[email protected]>
                <mailto:[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] <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] <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

Reply via email to