Como obter os métodos de um objeto?

89

Existe um método ou propriedade para obter todos os métodos de um objeto? Por exemplo:

function foo() {}
foo.prototype.a = function() {}
foo.prototype.b = function() {}

foo.get_methods(); // returns ['a', 'b'];

ATUALIZAÇÃO: Existe algum método assim no Jquery?

Obrigado.

thom
fonte

Respostas:

70
function getMethods(obj)
{
    var res = [];
    for(var m in obj) {
        if(typeof obj[m] == "function") {
            res.push(m)
        }
    }
    return res;
}
Makram Saleh
fonte
2
O for..incaminho é a abordagem padrão.
Makram Saleh
1
Obrigado pela sua edição, Chris! Acho que você gosta de TypeErrors…TypeError: '[object Object]' is not a function (evaluating 'obj(m)')
Julian F. Weinert
O código agora está corrigido com colchetes. Desculpe pela inconveniência.
Makram Saleh
Adicionada classificação da matriz por conveniência.
SomeGuyOnAComputer
há uma diferença se você avaliar a condição m instanceof Function?
Jose
46

Lembre-se de que tecnicamente os objetos javascript não possuem métodos. Eles têm propriedades, algumas das quais podem ser objetos de função. Isso significa que você pode enumerar os métodos em um objeto da mesma forma que pode enumerar as propriedades. Isso (ou algo próximo a isso) deve funcionar:

var bar
for (bar in foo)
{
    console.log("Foo has property " + bar);
}

Há complicações para isso porque algumas propriedades dos objetos não são enumeráveis, portanto, você não será capaz de encontrar todas as funções no objeto.

Reintegrar Monica Larry Osterman
fonte
2
talvez ele estivesse falando sobre console.log. Obrigado.
thom
2
Sim, eu não faço JS todos os dias, então não estou 100% otimista. Mas eu entendo a linguagem ..
Reintegrar Monica Larry Osterman
27

Você pode usar console.dir(object)para gravar as propriedades dos objetos no console.

pstenstrm
fonte
17

Em navegadores modernos, você pode usar Object.getOwnPropertyNamespara obter todas as propriedades (enumeráveis ​​e não enumeráveis) em um objeto. Por exemplo:

function Person ( age, name ) {
    this.age = age;
    this.name = name;
}

Person.prototype.greet = function () {
    return "My name is " + this.name;
};

Person.prototype.age = function () {
    this.age = this.age + 1;
};

// ["constructor", "greet", "age"]
Object.getOwnPropertyNames( Person.prototype );

Observe que isso só recupera propriedades próprias , portanto, não retornará propriedades encontradas em outro lugar na cadeia de protótipo. Essa, no entanto, não parece ser sua solicitação, portanto, presumirei que essa abordagem seja suficiente.

Se você gostaria de ver apenas propriedades enumeráveis , você pode usar Object.keys. Isso retornaria a mesma coleção, menos a constructorpropriedade não enumerável .

Sampson
fonte
6

Os métodos podem ser inspecionados na cadeia de protótipos do objeto usando as ferramentas de desenvolvedor do navegador (F12):

  console.log(yourJSObject);

ou mais diretamente

  console.dir(yourJSObject.__proto__);
Matoeil
fonte
4

Em ES6:

let myObj   = {myFn : function() {}, tamato: true};
let allKeys = Object.keys(myObj);
let fnKeys  = allKeys.filter(key => typeof myObj[key] == 'function');
console.log(fnKeys);
// output: ["myFn"]
Kevin beal
fonte
4

para mim, a única maneira confiável de obter os métodos da classe de extensão final era fazer assim:

function getMethodsOf(obj){
  const methods = {}
  Object.getOwnPropertyNames( Object.getPrototypeOf(obj) ).forEach(methodName => {
    methods[methodName] = obj[methodName]
  })
  return methods
}
Jo-Go
fonte
2
var funcs = []
for(var name in myObject) {
    if(typeof myObject[name] === 'function') {
        funcs.push(name)
    }
}

Estou em um telefone sem ponto-e-vírgula :) mas essa é a ideia geral.

Matt Greer
fonte
4
Qual telefone não tem ponto-e-vírgula, mas permite responder a perguntas? LOL
Hogan
Eu acho que um novo telefone é dois pontos seu nome!
Programas Redwolf de
1
var methods = [];
for (var key in foo.prototype) {
    if (typeof foo.prototype[key] === "function") {
         methods.push(key);
    }
}

Você pode simplesmente fazer um loop sobre o protótipo de um construtor e extrair todos os métodos.

Raynos
fonte
Isso não leva em conta os métodos diretamente anexados ao objeto
Matt Greer
@MattGreer, seu exemplo chamou um método em um construtor. Se ele deseja métodos de um construtor ou de um objeto, é uma questão diferente.
Raynos
1

a melhor maneira é:

let methods = Object.getOwnPropertyNames(yourobject);
console.log(methods)

use 'let' apenas em es6, use 'var' ao invés

Arturo Morales Rangel
fonte
1
Ele retorna uma lista dos atributos.
Ali Ben Messaoud
Como Ali aludiu, isso exclui funções definidas como getters / setters em uma classe (métodos).
Shaun
0

Obtenha os nomes dos métodos:

var getMethodNames = function (obj) {
    return (Object.getOwnPropertyNames(obj).filter(function (key) {
        return obj[key] && (typeof obj[key] === "function");
    }));
};

Ou obtenha os métodos:

var getMethods     = function (obj) {
    return (Object.getOwnPropertyNames(obj).filter(function (key) {
        return obj[key] && (typeof obj[key] === "function");
    })).map(function (key) {
        return obj[key];
    });
};
Sidanmor
fonte