Ok, thank you Logan. Still have to digest :)
I'm now fine with proxies, you can ignore this post. 2017-07-29 2:50 GMT+02:00 Logan Smyth <[email protected]>: > I almost mentioned that last time, alas. You have a bug in your proxy > `get` handler. It should be: > ``` > get(target, name, receiver) { > if (name[0] === '$') return target.getItem(name.substr(1)); > > return Reflect.get(target, name, receiver); > } > ``` > The third argument `receiver` being the important part here. > `Reflect.get(target, name, receiver)` is the correct reproduction of the > default non-proxy `get` behavior. `target[name]` is close, but loses > information, causing the bad behavior you are seeing. `target` is the > actual target initially passed to `new Proxy`, while `receiver` is the > object that was actually used to access the property, which is the actual > proxy object in this case. > > Updated fiddle: https://jsfiddle.net/2dgefd9d/2/ > > On Fri, Jul 28, 2017 at 5:37 PM, Tobias Buschor <[email protected]> > wrote: > >> wow, you are right! >> >> But this does not work. >> It returns "undefined" >> >> ``` >> class items { >> // ... >> get item3(){ >> return this.$3; >> } >> } >> ``` >> >> ``` >> myItems = new items(); >> console.log( myItems.item3 ); >> ``` >> >> see https://jsfiddle.net/2dgefd9d/1/ >> >> I see, the getter is called on the object itself and not on the proxy.... >> >> >> >> >> >> >> >> >> >> >> >> 2017-07-29 2:05 GMT+02:00 Logan Smyth <[email protected]>: >> >>> > but i can not act like this inside the Object, because i am not >>> working with the Proxy >>> >>> You're not quite taking into account the behavior of `this` in JS. >>> `this` is set at call-time, so when you do >>> >>> ``` >>> class items { >>> // ... >>> >>> getItem3(){ >>> return this.$3; >>> } >>> } >>> ``` >>> >>> `this` depends on how `getItem3` was called. In your case if you do >>> >>> ``` >>> myItems = new items(); >>> myItems.getItem3(); >>> ``` >>> `this` will be `myItems` because that is how you have called it, meaning >>> that `getItems3()` will behave just like if you had done `myItems.$3`. >>> >>> Your code works as expected in this Fiddle: https://jsfiddle.net/2 >>> dgefd9d/ >>> >>> On Fri, Jul 28, 2017 at 4:48 PM, Tobias Buschor < >>> [email protected]> wrote: >>> >>>> I realy like the possibility to react to dynamic properties, like what >>>> you can do with Proxies. >>>> But Proxies are not the (my) perfect solution. >>>> >>>> >>>> ``` >>>> class items { >>>> constructor() { >>>> return new Proxy(this, { >>>> get(target, name) { >>>> if (name[0] === '$') return >>>> target.getItem(name.substr(1)).value; >>>> return target[name]; >>>> } >>>> }); >>>> } >>>> getItem(id) { >>>> return this._item[id]; >>>> } >>>> } >>>> >>>> myItems = new items(); // [1] >>>> myItems.$1 >>>> ``` >>>> >>>> [1] this direct returns a Proxy for the newly created Object, ok.. >>>> i can do "myItems.$3" instead of "myItems.getItem(4)"; >>>> >>>> >>>> but i can not act like this inside the Object, because i am not working >>>> with the Proxy >>>> >>>> ``` >>>> class items { >>>> getItem3(){ >>>> return this.$3; >>>> } >>>> } >>>> ``` >>>> >>>> I have to do this instead... >>>> >>>> ``` >>>> class items { >>>> getItem3(){ >>>> return this.getItem(3); >>>> } >>>> } >>>> ``` >>>> >>>> What about something like getters and setters for the rest (undefined >>>> properties)? >>>> >>>> ``` >>>> class items { >>>> get...(name){ >>>> if (name[0] === '$') return this.getItem(name.substr(1)).value; >>>> } >>>> set...(name, value){ >>>> // implement setter for unknown >>>> } >>>> } >>>> ``` >>>> >>>> >>>> Maybe a stupid idea and certainly not thought through. >>>> But what do you think? >>>> >>>> >>>> >>>> >>>> >>>> >>>> _______________________________________________ >>>> es-discuss mailing list >>>> [email protected] >>>> https://mail.mozilla.org/listinfo/es-discuss >>>> >>>> >>> >> >> >> -- >> Freundliche Grüsse >> Tobias Buschor >> >> shwups GmbH >> Unterlindenberg 206 >> 9427 Wolfhalden >> >> +41 76 321 23 21 <+41%2076%20321%2023%2021> >> shwups.ch >> >> > > _______________________________________________ > es-discuss mailing list > [email protected] > https://mail.mozilla.org/listinfo/es-discuss > > -- Freundliche Grüsse Tobias Buschor shwups GmbH Unterlindenberg 206 9427 Wolfhalden +41 76 321 23 21 shwups.ch
_______________________________________________ es-discuss mailing list [email protected] https://mail.mozilla.org/listinfo/es-discuss

