@Kenta: Is your model likely to break/leak private data into foreign contexts 
once you start binding `this`?

On the other hand: Should you ever need to bind `this` for class functions? 
Right now, I'm not entirely sure whether the implementation of "protected" can 
be runtime-safe.

About your nomenclature: Why name it `protected` rather than `private`? Am I 
missing a key difference between the two here?

FWIW, have a look at [this](https://github.com/zenparsing/es-private-fields).

On Dienstag, 19. Januar 2016 21:40:12 CET, Thomas 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