<div dir="ltr">At this point I can't ignore how much overlap there is between this and the this-binding operator proposal <a href="https://github.com/tc39/proposal-bind-operator">https://github.com/tc39/proposal-bind-operator</a><div><br></div><div>```</div><div>const resolve = ::Promise.resolve; // takes and binds</div><div>```</div><div><br></div><div>As someone who often extracts functions with deconstruction, I'd love for there to be an extension to this proposal to handle this case.</div><div><br></div><div>```</div><div>const { resolve, reject } = ::Promise; // ?</div><div>```</div><div><br></div><div>That would leave the question though of what to do with nesting:</div><div><br></div><div>```</div><div>const { fn1, foo: { fn2 } } = ::bar; // fn1 is bound to bar. Is fn2 bound to bar, or foo?</div><div>```</div></div><br><div class="gmail_quote"><div dir="ltr">On Thu, 19 Jul 2018 at 15:58 Andrea Giammarchi <<a href="mailto:andrea.giammarchi@gmail.com">andrea.giammarchi@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">I guess one example would be more explicative: why cannot public static methods be defined in a similar manner?<div><br></div><div>```js</div><div><div>const withLazyBoundObjects = new WeakMap;</div><div>const withLazyBoundMethods = obj => {</div><div>  const descriptors = Object.getOwnPropertyDescriptors(obj);</div><div>  Object.keys(descriptors).forEach(key => {</div><div>    const desc = descriptors[key];</div><div>    const {value} = desc;</div><div>    if (desc.configurable && typeof value === 'function') {</div><div>      delete desc.value;</div><div>      delete desc.writable;</div><div>      desc.get = function (...args) {</div><div>        let methods = withLazyBoundObjects.get(this || obj);</div><div>        if (!methods)</div><div>          withLazyBoundObjects.set(this, methods = Object.create(null));</div><div>        return methods[key] || (methods[key] = value.bind(this));</div><div>      };</div><div>    }</div><div>  });</div><div>  return Object.defineProperties(obj, descriptors);</div><div>};</div><div><br></div><div>// example</div><div>const {resolve, reject} = withLazyBoundMethods(Promise);</div><div>resolve(123).then(console.log);</div></div><div>```</div></div><br><div class="gmail_quote"><div dir="ltr">On Thu, Jul 19, 2018 at 4:33 PM Andrea Giammarchi <<a href="mailto:andrea.giammarchi@gmail.com" target="_blank">andrea.giammarchi@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">sorry, that'd be `public get resolve()` and also `public #resolve()` so nobody should be confused about the fact I'm talking about public static methods.</div><br><div class="gmail_quote"><div dir="ltr">On Thu, Jul 19, 2018 at 4:32 PM Andrea Giammarchi <<a href="mailto:andrea.giammarchi@gmail.com" target="_blank">andrea.giammarchi@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">I know it's about subclassing, which is why I've asked why, once there's no context, the default/base one is not considered, but since everyone came back with the subclassing issue, which is actually what I've said myself on twitter about the current state, how about changing all public static methods that need it, to be getters ?<div><br></div><div>```js</div><div>class Promise {</div><div>  #resolve(...args) {</div><div>    return this.nativeImplementation(...args);</div><div>  }</div><div>  get resolve() {</div><div>    return #resolve.bind(this);</div><div>  }</div><div>}</div><div>```</div><div><br></div><div>we could argue `Promise.resolve === Promise.resolve` should be preserved, as behavior, so that we need a lazy defined getter ... **but** why not making public static restructuring from known constructors work regardless, under all circumstances ?</div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr">On Thu, Jul 19, 2018 at 4:11 PM T.J. Crowder <<a href="mailto:tj.crowder@farsightsoftware.com" target="_blank">tj.crowder@farsightsoftware.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">On Thu, Jul 19, 2018 at 12:56 PM, Andrea Giammarchi<div><<a href="mailto:andrea.giammarchi@gmail.com" target="_blank">andrea.giammarchi@gmail.com</a>> wrote:<br>> Why cannot Promise methods fallback to Promise constructor when the<br>> class/context is not available?<br><br>That sounds reasonable on first glance, but I'd be concerned about what happens when you do it after subclassing:</div><div><br></div><div>```js</div><div><font face="monospace, monospace">class MyPromise extends Promise {</font></div><div><font face="monospace, monospace">    // ...and adds some important feature...</font></div><div><font face="monospace, monospace">}</font></div><div><font face="monospace, monospace">// ...</font></div><div><font face="monospace, monospace">const {resolve, reject} = MyPromise;</font></div><div><font face="monospace, monospace">const p = resolve();</font></div><div><font face="monospace, monospace">p.someImportantFeature(/*...*/); // TypeError: undefined is not a function</font></div><div>```<br></div><div><br></div><div>...since `<font face="monospace, monospace">resolve</font>` fell back to `<font face="monospace, monospace">Promise</font>`. That feels like a footgun. Either subclassers would have to handle that, which they will forget to do, or it has to be a bit more complicated than just a simple fallback to `<font face="monospace, monospace">Promise</font>` (I don't immediately know what that "more complicated" answer would be.)</div><div><br></div><div>-- T.J. Crowder<br></div><div><div><br></div></div></div>
</blockquote></div>
</blockquote></div>
</blockquote></div>
_______________________________________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org" target="_blank">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" rel="noreferrer" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
</blockquote></div>