Because Math
是一个内置对象,其属性已标记不可枚举。许多内置对象都有这种行为,这就是为什么用循环遍历数组for..in
不会给你带来问题,直到Array.prototype
使用用户函数进行扩展,默认情况下这些函数始终是可枚举的。
直到最近不可枚举是常规 Javascript 代码无法访问的内部属性。然而,EMCAScript 5 指定了设置可枚举性和可写性的能力(尝试更改Math.PI
)任何对象属性通过对象.defineProperty() https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Object/defineProperty.
它还提供Object.getOwnPropertyNames() https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Object/getOwnPropertyNames作为获取对象所有属性的列表的方法,无论其可枚举性如何。
Object.getOwnPropertyNames(Math);
//returns
["LN10", "PI", "E", "LOG10E", "SQRT2", "LOG2E", "SQRT1_2", "LN2", "cos", "pow", "log", "tan", "sqrt", "ceil", "asin", "abs", "max", "exp", "atan2", "random", "round", "floor", "acos", "atan", "min", "sin"]
据我所知,目前支持这些功能的浏览器只有 Chrome 和 Safari。 Firefox 应该在版本 4 上支持它。IE9 我不确定,但微软已经表示他们打算最终支持 EMCAScript 5 标准。
我不相信在没有明确支持的情况下有任何方法可以在 Javascript 解释器中模拟此功能。