Вероятно, это того не стоит, но вы могли бы написать функцию, которая поможет вам деструктурировать методы объекта.Здесь bindMethods
делает это, используя помощник allKeys
, который собирает ключи из всей цепочки прототипов объекта и который в свою очередь зависит от walkPrototypeChain
.Очевидно, что при желании их можно сложить в одну функцию.
const walkPrototypeChain = (process, init, finish) => (obj) => {
let currObj = obj, currRes = init();
do {
currRes = process(currRes, currObj)
} while (currObj = Object.getPrototypeOf(currObj))
return finish(currRes)
}
const allKeys = walkPrototypeChain(
(set, obj) => {Object.getOwnPropertyNames(obj).forEach(k => set.add(k)); return set},
() => new Set(),
s => [...s]
)
const bindMethods = (obj) => allKeys(obj).reduce(
(o, n) => typeof obj[n] == 'function' ? ({...o, [n]: obj[n].bind(obj)}) : o,
{}
)
const date = new Date()
const {getDate, getFullYear} = bindMethods(date) // or any other date function
console.log(getDate())
console.log(getFullYear())