¿Cómo obtener los métodos de un objeto?


Respuestas:


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

2
El for..incamino es el enfoque estándar.
Makram Saleh

1
¡Gracias por tu edición, Chris! Creo que te gusta TypeErrors…TypeError: '[object Object]' is not a function (evaluating 'obj(m)')
Julian F. Weinert

El código ahora está arreglado con corchetes. Lo siento por los inconvenientes ocasionados.
Makram Saleh

Se agregó la clasificación de la matriz para mayor comodidad.
SomeGuyOnAComputer

¿Hay alguna diferencia si evalúas la condición m instanceof Function?
Jose

46

Recuerde que técnicamente los objetos javascript no tienen métodos. Tienen propiedades, algunas de las cuales pueden ser objetos de función. Eso significa que puede enumerar los métodos en un objeto al igual que puede enumerar las propiedades. Esto (o algo parecido a esto) debería funcionar:

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

Esto tiene complicaciones porque algunas propiedades de los objetos no se pueden enumerar, por lo que no podrá encontrar todas las funciones en el objeto.


2
tal vez estaba hablando de console.log. Gracias.
thom

2
Sí, no hago JS todos los días, así que no estoy 100% al tanto. Pero entiendo el idioma ..
ReinstateMonica Larry Osterman

27

Puede utilizar console.dir(object)para escribir las propiedades de los objetos en la consola.


19

En los navegadores modernos, puede usar Object.getOwnPropertyNamespara obtener todas las propiedades (tanto enumerables como no enumerables) de un objeto. Por ejemplo:

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

Tenga en cuenta que esto solo recupera propiedades propias , por lo que no devolverá propiedades encontradas en otros lugares de la cadena de prototipos. Sin embargo, esa no parece ser su solicitud, por lo que asumiré que este enfoque es suficiente.

Si solo desea ver propiedades enumerables , puede usar Object.keys. Esto devolvería la misma colección, menos la constructorpropiedad no enumerable .


6

Los métodos se pueden inspeccionar en la cadena de prototipos del objeto utilizando las herramientas de desarrollo del navegador (F12):

  console.log(yourJSObject);

o más directamente

  console.dir(yourJSObject.__proto__);

4

En 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 mí, la única forma confiable de obtener los métodos de la clase de extensión final era hacer lo siguiente:

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)
    }
}

Estoy en un teléfono sin punto y coma :) pero esa es la idea general.


4
¿Qué teléfono no tiene punto y coma pero te permite responder preguntas? LOL
Hogan

¡Creo que un teléfono nuevo lleva dos puntos tu nombre!
Programas Redwolf

1
var methods = [];
for (var key in foo.prototype) {
    if (typeof foo.prototype[key] === "function") {
         methods.push(key);
    }
}

Simplemente puede recorrer el prototipo de un constructor y extraer todos los métodos.


Esto no tendrá en cuenta los métodos directamente adjuntos al objeto
Matt Greer

@MattGreer su ejemplo llamó a un método en un constructor. Si quiere métodos de un constructor o de un objeto es un asunto diferente.
Raynos

1

la mejor forma es:

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

use 'let' solo en es6, use 'var' en su lugar


1
Devuelve una lista de los atributos.
Ali Ben Messaoud

Como Ali aludió, esto excluye las funciones definidas como getters / setters en una clase (métodos).
Shaun


0

Obtenga los nombres de los métodos:

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

O bien, obtenga los 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];
    });
};
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.