Мы можем использовать функцию Object.getOwnPropertyNames(), чтобы получить все имена свойств, связанные с объектом.
Затем мы можем отфильтровать результирующий массив, чтобы включить это имя свойства только в том случае, если это функция.
Мы определяем, является ли это функцией, используя для нее typeof .
Например, вот как мы могли бы создать служебную функцию, чтобы делать то, что нам нужно:
getMethods = (obj) => Object.getOwnPropertyNames(obj).filter(item => typeof obj[item] === 'function')
Здесь перечислены только методы, определенные для этого конкретного объекта, а не какой-либо метод, определенный в его цепочке прототипов.
Для этого мы должны пойти немного другим путем. Сначала мы должны повторить цепочку прототипов и перечислить все свойства в массиве. Затем мы проверяем, является ли каждое отдельное свойство функцией.
Простой способ убедиться, что мы не дублируем методы при навигации по цепочке прототипов (например, конструктор , который всегда присутствует), мы используем структуру данных набора, которая гарантирует уникальность значений:
const getMethods = (obj) => {
let properties = new Set()
let currentObj = obj
do {
Object.getOwnPropertyNames(currentObj).map(item => properties.add(item))
} while ((currentObj = Object.getPrototypeOf(currentObj)))
return [...properties.keys()].filter(item => typeof obj[item] === 'function')
}Пример использования:
getMethods("")
getMethods(new String('test'))
getMethods({})
getMethods(Date.prototype)Оригинал: “https://flaviocopes.com/how-to-list-object-methods-javascript/”