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

Reply via email to