It could be achieved with decorators but it won't be the same.

On a side note, that `Object.assign` operation doesn't do what you think it
does, there are better patterns (boilerplates, actually ...) to copy own
properties over within their descriptors, if different from enumerable data
descriptors.

As summary, beside the implementation, I think the final sugar ain't that
bad.

+1 here

P.S. the amount of `wm.set(a, b).get(a)` operations instead of `wm.set(a,
b)` returning `b` is too damn high ... I know, I know, old discussion is
old (and too late anyway)

On Tue, Jan 19, 2016 at 10:40 AM, Thomas <[email protected]>
wrote:

> Could this be achieved with decorators?
>
> > On 19 Jan 2016, at 8:31 PM, 森建 <[email protected]> wrote:
> >
> > Dear ES discuss subscribers,
> >
> > I'm Kenta Moriuchi,
> > Department of Art and Information Design
> > Kyushu University in Japan
> >
> > I propose `Protected State`.
> >
> > In ES2015:
> >
> > ```js
> > // utility
> > function createProtectedStorage() {
> >    const wm = new WeakMap();
> >
> >    return (self, protectedClass) => {
> >        const map = wm.get(self);
> >
> >        if(protectedClass == null) {
> >            return map || wm.set(self, Object.create(null)).get(self);
> >        }
> >
> >        const p = new protectedClass(self);
> >        if(map) {
> >            Object.assign(p, map);
> >        }
> >        return wm.set(self, p).get(self);
> >    }
> > }
> >
> > const _ = createProtectedStorage();
> >
> >
> > class Protected_A {
> >
> >    constructor(publicThis) {
> >        this.publicThis = publicThis;
> >    }
> >
> >    getName() {
> >        return `${this.publicThis.name} ${this.lastName}`;
> >    }
> > }
> >
> > class A {
> >
> >    constructor(name, lastName) {
> >        // protected this
> >        if(new.target === A)    _(this, Protected_A);
> >
> >        // public property
> >        this.name = name;
> >
> >        // protected property
> >        _(this).lastName = lastName;
> >    }
> >
> >    callGetName() {
> >        // call protected method
> >        return _(this).getName();
> >    }
> > }
> >
> > // test
> > const a = new A("foo", "bar");
> >
> > // "foo bar"
> > console.log(a.callGetName());
> >
> > // "foo"
> > console.log(a.name);
> >
> > // undefined
> > console.log(a.lastName);
> >
> >
> > // extends
> > class Protected_B extends Protected_A {
> >
> >    constructor(publicThis) {
> >        super(publicThis);
> >    }
> >
> >    getAge() {
> >        return this.age;
> >    }
> >
> > }
> >
> > class B extends A {
> >
> >    constructor(name, lastName, age) {
> >        super(name, lastName);
> >
> >        // protected this
> >        if(new.target === B)    _(this, Protected_B);
> >
> >        // protected property
> >        _(this).age = age;
> >    }
> >
> >    callGetAge() {
> >        return _(this).getAge();
> >    }
> >
> > }
> >
> > // test
> > const b = new B("foo", "bar", 18);
> >
> > // "foo bar"
> > console.log(b.callGetName());
> >
> > // 18
> > console.log(b.callGetAge());
> > ```
> >
> > As Syntax Suger (ES Next):
> >
> > ```js
> > class A {
> >
> >    protected lastName;
> >
> >    constructor(name, lastName) {
> >        // public property
> >        this.name = name;
> >
> >        // protected property
> >        protected.lastName = lastName;
> >    }
> >
> >    protected getName() {
> >        return `${this.name} ${protected.lastName}`;
> >    }
> >
> >    callGetName() {
> >        return protected.getName();
> >    }
> >
> > }
> >
> > class B extends A {
> >
> >    protected age;
> >
> >    constructor(name, lastName, age) {
> >        super(name, lastName);
> >        protected.age = age;
> >    }
> >
> >    protected getAge() {
> >        return protected.age;
> >    }
> >
> >    callGetAge() {
> >        return protected.getAge();
> >    }
> >
> > }
> > ```
> >
> > Please discuss this proposal, thank you.
> > _______________________________________________
> > 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

Reply via email to