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