Puede usar Object.getOwnPropertyNames()
para obtener todas las propiedades que pertenecen a un objeto, ya sean enumerables o no. Por ejemplo:
console.log(Object.getOwnPropertyNames(Math));
//-> ["E", "LN10", "LN2", "LOG2E", "LOG10E", "PI", ...etc ]
Luego puede usar filter()
para obtener solo 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 y versiones anteriores), las propiedades de los objetos integrados no son enumerables. Los objetos como window
y document
no están integrados, están definidos por el navegador y probablemente enumerables por diseño.
Desde ECMA-262 Edición 3 :
Objeto global
Hay un objeto global único (15.1), que se crea antes de que el control entre en cualquier contexto de ejecución. Inicialmente, el objeto global tiene las siguientes propiedades:
• Objetos integrados como Math, String, Date, parseInt, etc. Estos tienen atributos {DontEnum} .
• Propiedades definidas por el host adicionales. Esto puede incluir una propiedad cuyo valor es el objeto global en sí mismo; por ejemplo, en el modelo de objeto de documento HTML, la propiedad de ventana del objeto global es el objeto global en sí.
A medida que el control ingresa en contextos de ejecución, y a medida que se ejecuta el código ECMAScript, se pueden agregar propiedades adicionales al objeto global y se pueden cambiar las propiedades iniciales.
Debo señalar que esto significa que esos objetos no son propiedades enumerables del objeto Global. Si mira el resto del documento de especificación, verá que la mayoría de las propiedades y métodos integrados de estos objetos tienen el { DontEnum }
atributo establecido en ellos.
Actualización: otro usuario de SO, CMS, trajo un error de IE con respecto{ DontEnum }
a mi atención.
En lugar de verificar el atributo DontEnum, [Microsoft] JScript omitirá cualquier propiedad en cualquier objeto donde haya una propiedad con el mismo nombre en la cadena prototipo del objeto que tenga el atributo DontEnum.
En resumen, tenga cuidado al nombrar las propiedades de su objeto. Si hay una propiedad o método prototipo incorporado con el mismo nombre, IE lo omitirá cuando use un for...in
bucle.