如何在JavaScript对象中查找隐藏的属性/方法?

5
我希望能够通过这个函数的推广,自动确定给定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() 的等效函数,这些函数在探索新对象时非常有用。

我的理解是,只有内置对象具有隐藏属性(用户代码 evidently 不能设置“可枚举”属性,直到 HTML5),因此一种可能性是将 Math、String 等的属性硬编码到 dir() 等价物中(使用列表,例如 here)。但是有更好的方法吗?

编辑: 好的,我目前看到的最好的答案在 this thread 上。您无法轻松地使用自己的 JS 代码来完成此操作,但下一个最好的方法是在 Chrome 的开发人员工具(Chrome -> View -> Developer -> Developer Tools)中使用 console.dir。运行 console.dir(Math) 并单击三角形钻取以列出所有方法。这对于大多数交互式/发现工作足够好(您实际上不需要在运行时执行此操作)。

4个回答

7

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"]


啊哈。这就是Chrome的做法——我以为他们已经硬编码了。 - ramanujan

4

Object.getOwnPropertyNames 不会返回 "隐藏的那些" 属性。
Object.getOwnPropertyNames 返回非继承属性的名称。


3

这在先前的回答中有解释。基本上,规范明确要求(使用DontEnum),这些对象不可枚举。


当然。我认为那个帖子中的console.dir答案就是我正在寻找的,所以感谢你指引我找到它。 - ramanujan

0

这个在Firebug中可以用来查找对象方法。

Object.getOwnPropertyNames(Math);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接