2010-07-15 13 views

Respuesta

12

Puede recorrer las propiedades del objeto y probar su tipo.

for(var prop in whatever) { 
    if(typeof whatever[prop] == 'function') { 
     //do something 
    } 
} 
+0

+1 de cualquier manera 2 ¿obtener los argumentos para una función? – deostroll

+0

No. Todas las funciones nativas de JavaScript aceptan cualquier número de argumentos de todos modos. –

+0

@deostroll En un navegador que implementa toSource, Firefox solo ahora mismo, puede usar 'func.toSource(). Match (/ \ ((^^(\)] +) \) /) [1]'. Sin embargo, esto no funcionará en las funciones incorporadas. – Annan

6

Para agregar a las respuestas existentes, ECMAScript 5th ed. proporciona una forma de acceder a todas las propiedades de un objeto (incluso las no enumerables) utilizando el método Object.getOwnPropertyNames. Al tratar de enumerar las propiedades de los objetos nativos tales como Math, un for..in

for(var property in Math) { 
    console.log(property); 
} 

imprimirá nada en la consola. Sin embargo,

Object.getOwnPropertyNames(Math) 

volverá:

["LN10", "PI", "E", "LOG10E", "SQRT2", "LOG2E", "SQRT1_2", "abc", "LN2", "cos", "pow", "log", "tan", "sqrt", "ceil", "asin", "abs", "max", "exp", "atan2", "random", "round", "floor", "acos", "atan", "min", "sin"] 

Se puede escribir una función auxiliar en la parte superior de esta que solo vuelve métodos dados un objeto.

function getMethods(object) { 
    var properties = Object.getOwnPropertyNames(object); 
    var methods = properties.filter(function(property) { 
     return typeof object[property] == 'function'; 
    }); 
    return methods; 
} 

> getMethods(Math) 
["cos", "pow", "log", "tan", "sqrt", "ceil", "asin", "abs", "max", "exp", "atan2", "random", "round", "floor", "acos", "atan", "min", "sin"] 

Compatibilidad con ECMAScript 5th ed. es algo desalentador en este punto, ya que solo Chrome, IE9pre3 y Safari/Firefox son compatibles.

+0

¿razón por qué votar? – Anurag

+0

+1, no veo ningún motivo para un voto a la baja. Por cierto, IE9pre3 también lo admite. – CMS

+0

gracias @CMS, es bueno ver IE de puntillas con v9. Respuesta actualizada – Anurag

1

Esta función recibe un objeto arbitrario y devuelve el nombre de su prototipo, una lista con todos sus métodos y un objeto con el nombre de sus propiedades (y sus tipos). No tengo la oportunidad de probarlo en un navegador, pero funciona con Nodejs (v0.10.24).

function inspectClass(obj) {  
    var objClass, className; 
    var classProto; 
    var methods = []; 
    var attributes = {}; 
    var t, a; 
    try { 
     if (typeof(obj) != 'function') { 
      objClass = obj.constructor; 
     } else { 
      objClass = obj;  
     } 
     className = objClass.name; 
     classProto = objClass.prototype   
     Object.getOwnPropertyNames(classProto).forEach(function(m) { 
      t = typeof(classProto[m]); 
      if (t == 'function') { 
       methods.push(m); 
      } else { 
       attributes[m] = t; 
      }  
     }); 
    } catch (err) { 
     className = 'undefined'; 
    } 
    return { 'ClassName' : className, 
      'Methods' : methods, 
      'Attributes' : attributes 
    } 
} 

Ejemplo (con nodejs):

console.log(inspectClass(new RegExp("hello"))); 

de salida:

{ ClassName: 'RegExp', 
    Methods: [ 'constructor', 'exec', 'test', 'toString', 'compile' ], 
    Attributes: 
    { source: 'string', 
    global: 'boolean', 
    ignoreCase: 'boolean', 
    multiline: 'boolean', 
    lastIndex: 'number' } } 

Los siguientes ejemplos también trabajan con nodejs:

console.log(inspectClass(RegExp)); 
console.log(inspectClass("hello")); 
console.log(inspectClass(5)); 
console.log(inspectClass(undefined)); 
console.log(inspectClass(NaN)); 
console.log(inspectClass(inspectClass)); 
0

Una solución de una sola línea

Object.getOwnPropertyNames(JSON).filter(function(name){ return 'function' === typeof JSON[name]; }) 

[ 'de análisis sintáctico', 'stringify']

Object.getOwnPropertyNames(String).filter(function(name){ return 'function' === typeof String[name]; }) 

[ 'fromCharCode', 'fromCodePoint', 'prima']

Object.getOwnPropertyNames(Array).filter(function(name){ return 'function' === typeof Array[name]; }) 

['isArray', 'from', 'of']

Cuestiones relacionadas