-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathautobindthis.js
50 lines (42 loc) · 1.29 KB
/
autobindthis.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
"use strict";
const reactMethodNames = [
"componentWillMount",
"UNSAFE_componentWillMount",
"render",
"getSnapshotBeforeUpdate",
"componentDidMount",
"componentWillReceiveProps",
"UNSAFE_componentWillReceiveProps",
"shouldComponentUpdate",
"componentWillUpdate",
"UNSAFE_componentWillUpdate",
"componentDidUpdate",
"componentWillUnmount",
"componentDidCatch",
"setState",
"forceUpdate"
];
function autobind(self, options) {
options = Object.assign({}, options);
options.exclude = (options.exclude || []).concat(["constructor"]);
const prototype = Object.getPrototypeOf(self);
const methodsOfPrototype = Object.getOwnPropertyNames(prototype);
const filteredMethods = methodsOfPrototype.filter(
methodName => !options.exclude.includes(methodName)
);
filteredMethods.forEach(methodName => {
const method = self[methodName];
if (typeof method === "function") {
console.log(methodName);
self[methodName] = self[methodName].bind(self);
}
});
return self;
}
function react(self, options) {
options = Object.assign({}, options);
options.exclude = (options.exclude || []).concat(reactMethodNames);
return autobind(self, { exclude: reactMethodNames.concat(options.exclude) });
}
module.exports = autobind;
module.exports.react = react;