2016-02-23 23 views
3

假設我們有一類這樣的靜態方法:獲取一類

class Foo { 
    static bar() {} 
} 

我們可以稱之爲利用Foo.bar()bar靜態方法。但是我們怎樣才能得到一個只包含類的靜態方法的數組呢?

從我看到的,Object.getOwnPropertyNames(Foo)返回的不僅僅是"bar"元素。

如何從Object.getOwnPropertyNames(Foo)得到靜態方法或過濾出非靜態方法?

回答

6

Object.getOwnPropertyNames(Foo)不會返回實例方法。它的類Function返回其他性質,儘管(長度,名稱,原型,等等),所以你可以寫一個函數,這些過濾掉:

class Foo{ 
    static one() {} 
    two() {} 
    three() {} 
    static four() {} 
} 
const all = Object.getOwnPropertyNames(Foo) 
    .filter(prop => typeof Foo[prop] === "function"); 
console.log(all); // ["one", "four"] 

注:這不顯示任何繼承了靜態方法。它會變得更加混亂,因爲你需要在鏈上的每個功能上做到這一點。

+0

獲取父級靜態方法應該很容易,因爲我們可以訪問父類。 :) 非常感謝! –

+0

確實如此,但你必須記住,父函數將是'Function'和'Object',不一定是你定義的類。 – CodingIntrigue

+0

'length','name'和'prototype'都是* not *繼承的,它們是構造函數自己的屬性。 – Bergi