Skip to content

Commit 6332df7

Browse files
authored
Avoid extending built-in JS classes (#175)
* Avoid extending Promise. * Fallback to setting __proto__.
1 parent 1be5794 commit 6332df7

File tree

1 file changed

+14
-13
lines changed

1 file changed

+14
-13
lines changed

packages/react-async/src/reducer.js

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,26 @@
11
import { getInitialStatus, getIdleStatus, getStatusProps, statusTypes } from "./status"
22

33
// This exists to make sure we don't hold any references to user-provided functions
4-
class NeverSettle extends Promise {
5-
constructor() {
6-
super(() => {}, () => {})
7-
/* istanbul ignore next */
8-
if (Object.setPrototypeOf) {
9-
// Not available in IE 10, but can be polyfilled
10-
Object.setPrototypeOf(this, NeverSettle.prototype)
11-
}
12-
}
4+
// The way NeverSettle extends from Promise is complicated, but can't be done differently because Babel doesn't support
5+
// extending built-in classes. See https://babeljs.io/docs/en/caveats/#classes
6+
function NeverSettle() {}
7+
/* istanbul ignore next */
8+
if (Object.setPrototypeOf) {
9+
Object.setPrototypeOf(NeverSettle, Promise)
10+
} else {
11+
NeverSettle.__proto__ = Promise
12+
}
13+
NeverSettle.prototype = Object.assign(Object.create(Promise.prototype), {
1314
finally() {
1415
return this
15-
}
16+
},
1617
catch() {
1718
return this
18-
}
19+
},
1920
then() {
2021
return this
21-
}
22-
}
22+
},
23+
})
2324

2425
export const neverSettle = new NeverSettle()
2526

0 commit comments

Comments
 (0)