Como obter os métodos de um objeto?


Respostas:


70
function getMethods(obj)
{
    var res = [];
    for(var m in obj) {
        if(typeof obj[m] == "function") {
            res.push(m)
        }
    }
    return res;
}

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.


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.


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 .


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__);

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"]

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
}

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.


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.


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


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];
    });
};
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.