Why stop at class definitions?

e.g.
```js
let obj;
{
  let local = 0;
  obj = {
    get local() {
      return local;
    }
  }
}
```

becomes
```js
const obj = {
  #local: 0,
  get local() {
    return this.#local;
  }
}
```

On Fri, Aug 7, 2020 at 3:33 PM #!/JoePea <j...@trusktr.io> wrote:

> Not sure if the following is exactly how we'd want it to be, but it
> would be useful:
>
> ```js
> class Foo {
>   // calculatedValue is intended to have read-only properties
>   calculatedValue = {
>     #x: 0,
>     get x() { return this.#x },
>     #y: 0,
>     get y() { return this.#y },
>     #z: 0,
>     get z() { return this.#z },
>   }
>
>   update() {
>     this.calculatedValue.#x = 42 // ok
>     this.calculatedValue.#y = 42 // ok
>     this.calculatedValue.#z = 42 // ok
>   }
> }
> ```
>
> End user:
>
> ```js
> const foo = new Foo
> foo.calculatedValue.x // ok
> foo.calculatedValue.#x // syntax error
> ```
>
> We could currently do something like this:
>
> ```js
> class Foo {
>   #calcX = 0
>   #calcY = 0
>   #calcZ = 0
>
>   // calculatedValue is intended to have read-only properties
>   calculatedValue = (() => {
>     const self = this
>     return {
>       get x() { return self.#calcX },
>       get y() { return self.#calcY },
>       get z() { return self.#calcZ },
>     }
>   })()
>
>   update() {
>     this.#calcX = 42 // ok
>     this.#calcY = 42 // ok
>     this.#calcZ = 42 // ok
>   }
> }
> ```
>
> Any plans for something like this? Is there a plan for private fields
> for object literals? If so, maybe that can somehow tie into usage
> within class bodies with WeakMap-ish semantics.
>
> #!/JoePea
> _______________________________________________
> es-discuss mailing list
> es-discuss@mozilla.org
> https://mail.mozilla.org/listinfo/es-discuss
>
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to