2008-09-30 21 views

Respuesta

70

Claro:

function getMethods(obj) { 
    var result = []; 
    for (var id in obj) { 
    try { 
     if (typeof(obj[id]) == "function") { 
     result.push(id + ": " + obj[id].toString()); 
     } 
    } catch (err) { 
     result.push(id + ": inaccessible"); 
    } 
    } 
    return result; 
} 

Su uso:

alert(getMethods(document).join("\n")); 
+2

el try/catch es un buen enfoque. Hay algunas propiedades/métodos en IE que generarán un error de acceso. – scunliffe

+0

Sí, creo que también hay algunos en Firefox. – troelskn

+0

Tenga en cuenta que no funciona en algunos objetos integrados como Fecha: 'var a = new Date(); console.log (typeof a, getMethods (a)); ' Devuelve: ' object [] '. – FGM

6

Aquí hay una publicación en JS reflection. Debería hacer lo que estás buscando.

1

De here:

Ejemplo 1: En este ejemplo se escribe a cabo todas las propiedades del objeto "navegador", además de sus valores:

for (var myprop in navigator){ 
document.write(myprop+": "+navigator[myprop]+"<br>") 
} 

simplemente reemplazar 'navegante' con cualquier objeto que le interesa y deberías estar listo para ir.

Según lo mencionado por Anthony en la sección de comentarios - Esto devuelve todos los atributos no solo los métodos como la pregunta solicitada.

¡Uy! Eso me enseñará a intentar responder una pregunta en un idioma que no sé. Aún así, creo que el código es útil, pero no lo que se requería.

+0

Esto devuelve todos los atributos no sólo métodos como la cuestión pedido. En IE solo devuelve algunas de las propiedades y ninguno de los métodos. – AnthonyWJones

3

echar un vistazo a este código: -

function writeLn(s) 
{ 
    //your code to write a line to stdout 
    WScript.Echo(s) 
} 

function Base() {} 
Base.prototype.methodA = function() {} 
Base.prototype.attribA = "hello" 

var derived = new Base() 
derived.methodB = function() {} 
derived.attribB = "world"; 

function getMethods(obj) 
{ 
    var retVal = {} 

    for (var candidate in obj) 
    { 
     if (typeof(obj[candidate]) == "function") 
      retVal[candidate] = {func: obj[candidate], inherited: !obj.hasOwnProperty(candidate)} 
    } 
    return retVal 
} 

var result = getMethods(derived) 
for (var name in result) 
{ 
    writeLn(name + " is " + (result[name].inherited ? "" : "not") + " inherited") 
} 

La función getMethod devuelve el conjunto de métodos, junto con el hecho de que el método es uno que ha sido heredado de un prototipo.

Tenga en cuenta que si tiene la intención de utilizar esto en objetos que se suministran desde el contexto como el navegador/objeto DOM, entonces no funcionará IE.

0

Dado que los métodos en JavaScript son solo propiedades que son funciones, el bucle for..in los enumerará con una excepción: no enumerará los métodos integrados. Hasta donde yo sé, no hay forma de enumerar los métodos integrados. Y no puede declarar sus propios métodos o propiedades en un objeto que no son enumerables de esta manera.

3

Aquí es una muestra de ES6.

// Get the Object's methods names: 
function getMethodsNames(obj = this) { 
    return Object.keys(this) 
     .filter((key) => typeof this[key] === 'function'); 
} 

// Get the Object's methods (functions): 
function getMethods(obj = this) { 
    return Object.keys(this) 
     .filter((key) => typeof this[key] === 'function') 
     .map((key) => this[key]); 
} 

obj = this es un parámetro predeterminado ES6, puede pasar de un objeto o por defecto lo this.

Object.keys devuelve una matriz de propiedades enumerativas propias de Object. Sobre el objeto window devolverá [..., 'localStorage', ...'location'].

(param) => ... es una función de la flecha ES6, que es una abreviatura de

function(param) { 
    return ... 
} 

con un rendimiento implícito.

Array.filter crea una nueva matriz con todos los elementos que pasan la prueba (typeof this[key] === 'function').

Array.map crea una nueva matriz con los resultados de llamar a una función proporcionada en cada elemento de esta matriz (return this[key]).

+0

¡Esto es útil! Una corrección: dentro de las funciones se debe usar 'obj' en lugar de' this'. –

2

Si solo desea ver lo que hay dentro de un objeto, puede imprimir todas las claves del objeto. Algunos de ellos pueden ser variables, algunos - métodos.

El método no es muy preciso, sin embargo, es muy rápido:

console.log(Object.keys(obj)); 
+1

Eso es muy útil. Es una pena que tu respuesta solo haya recibido un voto explícito (¡de mí, sí!). – Christian

Cuestiones relacionadas