如何查找JavaScript对象中的隐藏属性/方法?
我想要自动找出一个给定的JavaScript对象的所有属性,包括那些隐藏的属性,方法是对这个函数进行一些改进:
function keys(obj) {
var ll = [];
for(var pp in obj) {
ll.push(pp);
}
return ll;
}
这个方法对用户自己定义的对象有效,但对很多内置对象就不行了:
repl> keys({"a":10,"b":2}); // ["a","b"]
repl> keys(Math) // returns nothing!
简单来说,我想写一个类似于Python的dir()和help()的功能,这两个在探索新对象时非常有用。
我的理解是,只有内置对象才有隐藏属性(用户代码显然在HTML5之前无法设置“可枚举”属性),所以一种方法是直接把Math、String等的属性硬编码到一个dir()的替代方案中(可以参考这里的列表)。但有没有更好的办法呢?
编辑:好的,到目前为止我看到的最好答案在这个讨论串里。你不能轻易用自己的JS代码做到这一点,但下一个最好的方法是使用Chrome开发者工具中的console.dir(Chrome -> 查看 -> 开发者 -> 开发者工具)。运行console.dir(Math),然后点击三角形的展开按钮,就能列出所有方法。这对于大多数交互式或探索性工作来说已经足够了(你其实不需要在运行时做这个)。
4 个回答
这个内容在之前的回答中有解释。简单来说,规范明确要求(使用DontEnum
)这些对象是不可枚举的。
Object.getOwnPropertyNames
不会返回“隐藏的属性”。
Object.getOwnPropertyNames
返回的是那些没有被继承的属性名称。
ECMAScript 第五版 定义了一个叫做 Object.getOwnPropertyNames
的方法,它可以返回一个数组,这个数组里包含了传入对象的所有属性,包括那些不可枚举的属性。到目前为止,只有 Chrome 浏览器实现了这个功能。
Object.getOwnPropertyNames({a: 10, b: 2});
返回的结果是 ["b", "a"]
(顺序不固定)
Object.getOwnPropertyNames(Math);
返回的结果是 ["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"]