我想自动确定所有属性(包括 隐藏的)在给定的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的开发者工具中使用console.dir(Chrome - > View - > Developer - > Developer Tools)。运行console.dir(Math)并单击三角形向下钻取以列出所有方法。这对于大多数交互/发现工作来说已经足够好了(你真的不需要在运行时这样做)。
答案 0 :(得分:5)
ECMAScript 5th ed.定义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"]
答案 1 :(得分:4)
Object.getOwnPropertyNames
不会返回“隐藏的人”
Object.getOwnPropertyNames
返回非继承属性的名称。
答案 2 :(得分:3)
这在previous answer中有解释。基本上,规范明确要求(使用DontEnum
)这些对象不可枚举。
答案 3 :(得分:0)
这可以在firebug中找到对象方法。
Object.getOwnPropertyNames(数学);