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