const {resolve} = Promise; // fails

Claude Pache claude.pache at gmail.com
Thu Jul 19 15:23:01 UTC 2018



> Le 19 juil. 2018 à 16:32, Andrea Giammarchi <andrea.giammarchi at gmail.com> a écrit :
> 
> 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 ?
> 
> ```js
> class Promise {
>   #resolve(...args) {
>     return this.nativeImplementation(...args);
>   }
>   get resolve() {
>     return #resolve.bind(this);
>   }
> }
> ```
> 
> 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 ?
> 

Nice hack... But it imposes all subclasses of `Promise` that override the `resolve` method to use a similar trick, because the following will break:

```js
class MyPromise extends Promise {
    static resolve() {
        // do fancy stuff
        return super.resolve()
    }
}

const {resolve} = MyPromise

resolve() // TypeError: undefined is not an object
```

Per the KISS principle, let’s avoid to be clever.

—Claude



More information about the es-discuss mailing list