@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

