Re: EcmaScript Proposal – Private methods and fields proposals.

Waldemar Horwat waldemar at google.com
Tue Apr 17 23:32:35 UTC 2018


On 04/17/2018 02:26 PM, Sultan wrote:
>> In the transpilation you created the field using "registry.set(this, {id: 0})"
>>in the constructor.  If you then claim that any write to the field can also create it, then you get the hijacking behavior which you wrote doesn't happen.
> 
> The difference between
> 
> class A {
>    private id = 0
> }
> 
> and
> 
> class A {
>    constructor() {
> private.id <http://private.id> = 0
>    }
> }
> 
> is the likened to the difference between
> 
> (function (){
>    var registry = WeakMap()
> 
>    function A () {
>      registry.set(this, {id: 0})
>    }
> 
>    return A
> })()
> 
> and
> 
> (function () {
>    var registry = WeakMap()
> 
>    function A () {
>      registry.set(this, {})
>      registry.get(this)["id"] = 0
>    }
> 
>    return A
> })
> 
> I don't see how this permits the hijacking behavior previously mentioned, that is –
> 
> (new A()).write.call({}, 'pawned');
> 
> Would still fail in the same way for both of these variants.

OK; you split creation into two phases.  That's fine.  Do you limit classes to creating only the private fields declared in the class, or can they create arbitrarily named ones?

>>They just lexically scope the private names in their own separate namespace.  #foo refers to the innermost enclosing class that has a private field called foo.
> 
> I'm not sure i understand, Does #foo refer to this.#foo? Can you post a fleshed out example of this?

The full form is expr.#foo, where expr can be `this` or some other expression appropriate in front of a dot.  The #foo binds to the innermost enclosing class that has a private field called foo.  If expr doesn't evaluate to an instance of that class, you fail and throw.

Read the proposals.

     Waldemar


More information about the es-discuss mailing list