Quiero saber como listar todos los métodos disponibles para un objeto como por ejemplo:
alert(show_all_methods(Math));
Esto debería imprimir:
abs, acos, asin, atan, atan2, ceil, cos, exp, floor, log, max, min, pow, random,round, sin, sqrt, tan, …
Puede utilizar Object.getOwnPropertyNames()
para obtener todas las propiedades que pertenecen a un objeto, sean enumerables o no. Por ejemplo:
console.log(Object.getOwnPropertyNames(Math));
//-> ["E", "LN10", "LN2", "LOG2E", "LOG10E", "PI", ...etc ]
A continuación, puede utilizar filter()
para obtener sólo los métodos:
console.log(Object.getOwnPropertyNames(Math).filter(function (p) {
return typeof Math[p] === 'function';
}));
//-> ["random", "abs", "acos", "asin", "atan", "ceil", "cos", "exp", ...etc ]
En los navegadores ES3 (IE 8 e inferiores), las propiedades de los objetos incorporados no son enumerables. Objetos como window
y document
no son incorporados, son definidos por el navegador y probablemente enumerables por diseño.
Objeto Global Hay un único objeto global objeto (15.1), que se crea antes de que de que el control entre en cualquier contexto de ejecución. Inicialmente el objeto global tiene las las siguientes propiedades:
;
- Objetos incorporados objetos como Math, String, Date parseInt, etc. Estos tienen atributos { DontEnum }.
- Propiedades adicionales definidas por el host propiedades adicionales. Puede incluir una propiedad propiedad cuyo valor es el propio objeto global por ejemplo, en el modelo de objeto de documento HTML modelo de objeto de documento HTML la propiedad window del objeto global es el propio objeto global. el propio objeto global.
> Como control entra en contextos de ejecución, y como se ejecuta código ECMAScript, propiedades adicionales pueden ser añadidas a el objeto global y las propiedades iniciales pueden cambiarse las propiedades iniciales.
Debo señalar que esto significa que esos objetos no son propiedades enumerables del objeto Global. Si usted mira a través del resto del documento de especificación, verá que la mayoría de las propiedades y métodos incorporados de estos objetos tienen el atributo { DontEnum }
establecido en ellos.
Actualización: un compañero usuario SO, CMS, trajo un IE error con respecto a { DontEnum }
a mi atención.
En lugar de comprobar el atributo DontEnum, [Microsoft] JScript omitirá cualquier propiedad en cualquier objeto donde haya una propiedad con el mismo nombre en la cadena de prototipos del objeto que tenga el atributo DontEnum.
En resumen, tenga cuidado al nombrar las propiedades de sus objetos. Si hay una propiedad o método prototipo incorporado con el mismo nombre entonces IE se lo saltará cuando use un bucle for...in
.
var methods = [];
for (var m in obj) {
if (typeof obj[m] == "function") {
methods.push(m);
}
}
alert(methods.join(","));
De esta forma, obtendrás todos los métodos que puedes invocar sobre obj
. Esto incluye los métodos que "hereda" de su prototipo (como getMethods()
en java). Si sólo quieres ver los métodos definidos directamente por obj
puedes comprobarlo con hasOwnProperty
:
var methods = [];
for (var m in obj) {
if (typeof obj[m] == "function" && obj.hasOwnProperty(m)) {
methods.push(m);
}
}
alert(methods.join(","));
La respuesta corta es que no se puede porque Math
y Date
(que se me ocurren a mí, seguro que hay otros) no son objetos normales. Para ver esto, crea un simple script de prueba:
<html>
<body>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"></script>
<script type="text/javascript">
$(function() {
alert("Math: " + Math);
alert("Math: " + Math.sqrt);
alert("Date: " + Date);
alert("Array: " + Array);
alert("jQuery: " + jQuery);
alert("Document: " + document);
alert("Document: " + document.ready);
});
</script>
</body>
</html>
Usted ve que se presenta como un objeto de la misma manera que el documento en general, pero cuando en realidad tratar de ver en ese objeto, se ve que it's de código nativo y algo que no se expone de la misma manera para la enumeración.