<div dir="ltr">That's certainly a clever solution, but one without precedent in the language. It also means you can't `Promise.resolve.call(SubPromise)`, although perhaps you could avoid that by skipping `.bind` and creating a normal function wrapper inside the getter - I'm curious how that might be implemented as well as specified.</div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jul 19, 2018 at 4:54 PM, Andrea Giammarchi <span dir="ltr"><<a href="mailto:andrea.giammarchi@gmail.com" target="_blank">andrea.giammarchi@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">My code doesn't suffer what Domenic says.<div><br></div><div>Once again:</div><span class=""><div><br></div><div>```js</div><div><div>const withLazyBoundObjects = new WeakMap;</div><div>const withLazyBoundMethods = obj => {</div><div>  const descriptors = Object.<wbr>getOwnPropertyDescriptors(obj)<wbr>;</div><div>  Object.keys(descriptors).<wbr>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><div><br></div></span><div>// patch the Promise</div><div>withLazyBoundMethods(Promise);<br></div><div><br></div><div>// have a class that extends Promise</div><div>class SubPromise extends Promise {}<br></div><div><br></div><div>// test inheritance</div><div>SubPromise.resolve() instanceof SubPromise; // true<br></div><div>(0,SubPromise.resolve)() instanceof SubPromise; // true<br></div><div><br></div><div>// even the Promise ?</div><div>Promise.resolve() instanceof SubPromise; // false, it's Promise<br></div><div>(0,Promise.resolve)() instanceof SubPromise; // false, it's Promise<br></div><div>```</div><div><br></div><div>So, why cannot we have above behavior in core?</div><div><br></div><div><br></div></div><div class="HOEnZb"><div class="h5"><br><div class="gmail_quote"><div dir="ltr">On Fri, Jul 20, 2018 at 1:36 AM Jordan Harband <<a href="mailto:ljharb@gmail.com" target="_blank">ljharb@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">> <span style="font-size:12.800000190734863px">TL;DR why aren't public static methods that need context **all** lazily defined as bound (once) on demand? That would make every single public static method consistent, accordingly with the Class you extracted them from, right? That's not clever, that's usually developers expectations because historically all public static methods don't need the Class to work.</span><div><span style="font-size:12.800000190734863px"><br></span></div><div><span style="font-size:12.800000190734863px">I believe </span><a href="https://github.com/tc39/ecma262/issues/544#issuecomment-236487230" target="_blank">https://github.com/<wbr>tc39/ecma262/issues/544#<wbr>issuecomment-236487230</a> answers this - specifically, expressing that the claimed better design is for *nothing* to be bound.</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jul 19, 2018 at 4:22 PM, Andrea Giammarchi <span dir="ltr"><<a href="mailto:andrea.giammarchi@gmail.com" target="_blank">andrea.giammarchi@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Reading that looks like nobody answered my question, explained through some code that wouldn't have any issue with subclassing.<div><br></div><div>So no, there's no answer to my latest question in there, unless I've missed it.</div></div><div class="m_-6263503497816102240m_6934455969589763040HOEnZb"><div class="m_-6263503497816102240m_6934455969589763040h5"><br><div class="gmail_quote"><div dir="ltr">On Thu, Jul 19, 2018 at 7:56 PM Jordan Harband <<a href="mailto:ljharb@gmail.com" target="_blank">ljharb@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">This question has been answered here: <a href="https://github.com/tc39/ecma262/issues/544" target="_blank">https://github.com/tc39/<wbr>ecma262/issues/544</a></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jul 19, 2018 at 9:27 AM, Andrea Giammarchi <span dir="ltr"><<a href="mailto:andrea.giammarchi@gmail.com" target="_blank">andrea.giammarchi@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><span>> Per the KISS principle, let’s avoid to be clever.<br><div><br></div></span><div>I think my next code example is less clever, but the only reason I've written hacks or code was not to be advocated or adopted, just to explain what could happen internally.</div><div><br></div><div>TL;DR why aren't public static methods that need context **all** lazily defined as bound (once) on demand? That would make every single public static method consistent, accordingly with the Class you extracted them from, right? That's not clever, that's usually developers expectations because historically all public static methods don't need the Class to work.</div></div><div class="m_-6263503497816102240m_6934455969589763040m_-4831146404616835760m_2532944477929845839HOEnZb"><div class="m_-6263503497816102240m_6934455969589763040m_-4831146404616835760m_2532944477929845839h5"><br><div class="gmail_quote"><div dir="ltr">On Thu, Jul 19, 2018 at 5:23 PM Claude Pache <<a href="mailto:claude.pache@gmail.com" target="_blank">claude.pache@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
<br>
> Le 19 juil. 2018 à 16:32, Andrea Giammarchi <<a href="mailto:andrea.giammarchi@gmail.com" target="_blank">andrea.giammarchi@gmail.com</a>> a écrit :<br>
> <br>
> 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 ?<br>
> <br>
> ```js<br>
> class Promise {<br>
>   #resolve(...args) {<br>
>     return this.nativeImplementation(...<wbr>args);<br>
>   }<br>
>   get resolve() {<br>
>     return #resolve.bind(this);<br>
>   }<br>
> }<br>
> ```<br>
> <br>
> 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 ?<br>
> <br>
<br>
Nice hack... But it imposes all subclasses of `Promise` that override the `resolve` method to use a similar trick, because the following will break:<br>
<br>
```js<br>
class MyPromise extends Promise {<br>
    static resolve() {<br>
        // do fancy stuff<br>
        return super.resolve()<br>
    }<br>
}<br>
<br>
const {resolve} = MyPromise<br>
<br>
resolve() // TypeError: undefined is not an object<br>
```<br>
<br>
Per the KISS principle, let’s avoid to be clever.<br>
<br>
—Claude<br>
<br>
</blockquote></div>
</div></div><br>______________________________<wbr>_________________<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/<wbr>listinfo/es-discuss</a><br>
<br></blockquote></div><br></div>
</blockquote></div>
</div></div></blockquote></div><br></div>
</blockquote></div>
</div></div></blockquote></div><br></div>