2010-05-30 70 views
2

我想自動確定所有屬性(包括 隱藏的人)在給定的Javascript對象的,通過這個 功能的概括:如何在Javascript對象中查找隱藏的屬性/方法?

function keys(obj) { 
    var ll = []; 
    for(var pp in obj) { 
     ll.push(pp); 
    } 
    return ll; 
} 

這適用於用戶定義的對象,但失敗了很多builtins:

repl> keys({"a":10,"b":2}); // ["a","b"] 
repl> keys(Math) // returns nothing! 

基本上,我想編寫等效於Python的dir()和help(),這對探索新對象非常有用。

我的理解是隻有內建對象具有隱藏屬性(用戶代碼evidently不能將「enumerable」屬性設置爲HTML5),因此一種可能性是將Math,String等的屬性簡單地硬編碼爲dir()等價物(使用列表,如here)。但是有更好的方法嗎?

編輯:好吧,我目前看到的最佳答案是this thread。你不能用自己的JS代碼輕鬆做到這一點,但下一個最好的事情是在Chrome的開發工具中使用console.dir(Chrome - > View - > Developer - > Developer Tools)。運行console.dir(Math)並單擊三角形向下鑽取以列出所有方法。這對於大多數交互/發現工作來說已經足夠好了(在運行時你並不需要這麼做)。

回答

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

+0

啊哈。所以這就是Chrome的做法 - 我認爲他們已經對它進行了硬編碼。 – ramanujan 2010-06-01 12:51:40

3

這在previous answer中有解釋。基本上,規範明確要求(使用DontEnum)這些對象不可枚舉。

+0

當然可以。我認爲那個線程中的console.dir答案就是我正在尋找的東西,所以謝謝你指點我。 – ramanujan 2010-05-30 22:04:47

4

Object.getOwnPropertyNames不會返回 「已隱藏的」。
Object.getOwnPropertyNames返回非繼承屬性的名稱。

0

這個工程在firebug中找到對象的方法。

Object.getOwnPropertyNames(數學);

相關問題