With my proposed `Lazy` class, if you were to use an instance as a
descriptor, the `this` value it'd receive would not be a `Lazy`
instance like it'd expect.

Consider it the difference between `a.self` and `b.get()` in your
example. `b.get()` is what I'd be expecting.
-----

Isiah Meadows
m...@isiahmeadows.com

Looking for web consulting? Or a new website?
Send me an email and we can get started.
www.isiahmeadows.com


On Thu, Aug 31, 2017 at 12:12 PM, Andrea Giammarchi
<andrea.giammar...@gmail.com> wrote:
>> using it in a descriptor would get it passed the wrong `this`
>
> sorry, what?
>
> ```js
> var a = {};
> var b = {get() { return this; }};
> Object.defineProperty(a, 'self', b);
>
> a.self === a; // true
> ```
>
>
> On Thu, Aug 31, 2017 at 5:09 PM, Isiah Meadows <isiahmead...@gmail.com>
> wrote:
>>
>> No. `Lazy` is intended to be an object to be used directly, not a
>> descriptor of any kind.
>>
>> (My `lazy.get()` is an unbound method, so using it in a descriptor
>> would get it passed the wrong `this`.)
>> -----
>>
>> Isiah Meadows
>> m...@isiahmeadows.com
>>
>> Looking for web consulting? Or a new website?
>> Send me an email and we can get started.
>> www.isiahmeadows.com
>>
>>
>> On Thu, Aug 31, 2017 at 9:39 AM, Andrea Giammarchi
>> <andrea.giammar...@gmail.com> wrote:
>> > the following is how I usually consider lazy values
>> >
>> > ```js
>> > class Any {
>> >   _lazy(name) {
>> >     switch (name) {
>> >       case 'uid': return Math.random();
>> >       // others ... eventually
>> >     }
>> >   }
>> >   get uid() {
>> >     var value = this._lazy('uid');
>> >     // from now on, direct access
>> >     Object.defineProperty(this, 'uid', {value});
>> >     return value;
>> >   }
>> > }
>> >
>> > const a = new Any;
>> > a.uid === a.uid; // true
>> > ```
>> >
>> > If I understand correctly your proposal is to use Lazy as generic
>> > descriptor, is that correct ?
>> >
>> > ```js
>> > Object.defineProperty({}, 'something', new Lazy(function (val) {
>> >   return this.shakaLaka ? val : 'no shakaLaka';
>> > }));
>> > ```
>> >
>> > ???
>> >
>> > If that's the case I see already people confused by arrow function
>> > in case they need to access the context,
>> > plus no property access optimization once resolved.
>> >
>> > It's also not clear if such property can be set again later on (right
>> > now it
>> > cannot)
>> > 'cause lazy definition doesn't always necessarily mean inability to
>> > reassign.
>> >
>> > What am I missing/misunderstanding?
>> >
>> > Regards
>> >
>> >
>> >
>> > On Thu, Aug 31, 2017 at 2:21 PM, Isiah Meadows <isiahmead...@gmail.com>
>> > wrote:
>> >>
>> >> It'd be really nice if lazy values made it into the spec somehow. I've
>> >> already found myself using things like this [1] quite a bit, and I've
>> >> also found myself frequently initializing properties not on first
>> >> access.
>> >>
>> >> [1]:
>> >> https://gist.github.com/isiahmeadows/4c0723bdfa555a1c2cb01341b323c3d4
>> >>
>> >> As for what would be a nice API, maybe something like one of these?
>> >>
>> >> ```js
>> >> class Lazy<T> {
>> >>     constructor(init: () => T);
>> >>     get(): T; // or error thrown
>> >> }
>> >>
>> >> function lazy<T>(init: () => T): () => T; // or error thrown
>> >>
>> >> function lazy<T>(init: () => T): {
>> >>     get(): T; // or error thrown
>> >> }
>> >> ```
>> >>
>> >> Alternatively, syntax might work, with `do` expression semantics:
>> >>
>> >> ```js
>> >> const x = lazy do { ... }
>> >> // expose via `x.get()` or just `x()`
>> >> ```
>> >>
>> >> -----
>> >>
>> >> Isiah Meadows
>> >> m...@isiahmeadows.com
>> >>
>> >> Looking for web consulting? Or a new website?
>> >> Send me an email and we can get started.
>> >> www.isiahmeadows.com
>> >> _______________________________________________
>> >> 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