2016-09-27 16 views
4

我正在嘗試使用命令行來簡單地獲取Node.js中某個類的可用函數列表。獲取Node.js中某個類的可用函數列表

基於以前的網絡搜索,我偶然發現了Object.getOwnPropertyNames(),但它看起來這個函數是不一致的,否則我不明白爲什麼它適用於某些類而不適用於其他類。

讓我們通過一個例子來工作,也許有人可以提供幫助。目前,本例中節點-v輸出v4.4.5。

首先,假設我想獲得Math類的函數列表。從節點控制檯,這工作得很好,我得到:

[[email protected] /]# node 
> Object.getOwnPropertyNames(Math) 
[ 'E', 
    'LN10', 
    'LN2', 
    'LOG2E', 
    'LOG10E', 
    'PI', 
    'SQRT1_2', 
    'SQRT2', 
    'random', 
    'abs', 
    'acos', 
    'asin', 
    'atan', 
    'ceil', 
    'exp', 
    'floor', 
    'log', 
    'round', 
    'sqrt', 
    'atan2', 
    'pow', 
    'max', 
    'min', 
    'imul', 
    'sign', 
    'trunc', 
    'tanh', 
    'asinh', 
    'acosh', 
    'atanh', 
    'hypot', 
    'fround', 
    'clz32', 
    'cbrt', 
    'cos', 
    'sin', 
    'tan', 
    'sinh', 
    'cosh', 
    'log10', 
    'log2', 
    'log1p', 
    'expm1' ] 
> 

很酷。這樣可行。現在

,因爲Node.js的更多的是服務器端編程,讓我們來看看,如果同樣的事情,工作對於在幾乎每一個「Hello World」的例子類型使用Node.js的一個共同的類:http.Server

讓我們嘗試同樣的事情:

> Object.getOwnPropertyNames(http.Server) 
[ 'length', 'name', 'prototype', 'super_' ] 

嗯....這個比較的文檔here,它似乎缺少基本的東西,像server.close()server.listen()。仔細查看文檔,這個類是net.Server的一個子類,所以也許我必須查看該類的方法。讓我們看看是否能工程:

> Object.getOwnPropertyNames(net.Server) 
[ 'length', 'name', 'prototype', 'super_' ] 

嗯......如果我們比較的文檔,以net.Server我們缺少基本功能,如server.address()server.getConnections()等。

誰能幫我明白了:

(一)爲什麼getOwnPropertyNames似乎表明所有對於某些類的方法,但不是別人,... (b)是有另一種「官方」的方式來簡單地名單Node.js中的對象的可用函數,而無需讀取API文檔以獲取這樣的列表?

+0

'getOwnPropertyNames'不爬上原型樹。使用'for..in'循環來獲取所有繼承的屬性。 – 4castle

+0

好的謝謝。你能給我一個可以在命令行上工作的快速例子嗎?我會循環通過'prototype'屬性嗎? –

回答

0

如果你看一下docsgetOwnPropertyNames您將看到:

如果你只想要枚舉的屬性,看Object.keys()或循環使用的...(不過請注意,這個將返回不是直接在該對象上找到的枚舉屬性,而是也沿着原型鏈爲對象返回,除非後者使用hasOwnProperty()過濾)。

這是什麼要說的是,這兩個getOwnPropertyNames() & Object.keys()只會對象本身返回枚舉的屬性,不會給你的對象原型的任何信息。

因此,看起來沒有內置功能來實現您想要的功能,因此您必須自己編寫代碼。例如:

for (var prop in obj) { 
    console.log('obj.' + prop + ' = ' + obj[prop]); 
} 

注:你可以讓自己的工具庫,包裝這樣的想法,這樣你可以將它包括要在運行任何項目

+1

馬特 - 非常感謝!這清除了我的問題的一部分。我做了一個小的演示文件,說明你的循環爲'http.Server' 這應該允許其他人輕鬆地嘗試你的建議: 'var http = require('http'); var serverObj = new http.Server(); (serverObj中的var prop)//console.log('serverObj。'+ prop +'='+ serverObj [prop]); console.log('serverObj。'+ prop); }' 您的原始解決方案還顯示了每個函數的源代碼。我修改它只是打印出屬性名稱。 –

+0

不要忘記投票/標記;) –

相關問題