2016-09-22 78 views
2

我有一個類調用其他方法的方法:ES6:如果類有方法?

class MyClass { 
    build(methods) { 
    methods.forEach((method) => { 
     if (this.method) { 
     this.method(); 
     } 
    }); 
    } 

    stuff() {} 
    moreStuff() {} 
} 

const a = MyClass(); 
a.build(['stuff', 'moreStuff']); 

我一直沒能找到對任何類的特殊方法的任何引用。我的第一個想法是使用hasOwnProperty(但eslint讓我覺得我不應該在課堂上使用它)。上面的方法不能可靠地工作,因爲類具有內置函數。

我也在尋找Reflect,因爲這可能是我的挽救優雅,但我真的可以使用一些關於此場景最佳實踐的指導嗎?

+0

向我們展示如何打算調用'build',請 – Bergi

+0

「*沒有提及任何特殊的類的方法*」 - 這是因爲類沒什麼特別的,並且不需要任何特殊的方法。它們只是與'.prototype'對象一樣的構造函數(儘管它們的原型方法不是可枚舉的)。 – Bergi

+0

@Bergi我明白,他們只是語法糖,但我真的希望他們會有一些很酷的內省方法。我更新了我的代碼。我猜我應該重構並將'build'方法分離爲一個函數,然後使用某種'Reflect'。 –

回答

3

我認爲你正在尋找

build (methodnames) { 
    for (const methodname of methodnames) { 
     if (typeof this[methodname] == "function") { 
      this[methodname](); 
     } 
    } 
} 

有什麼特別的課程 - 事實上你應該忽略他們。如果你想調用某個方法,唯一重要的是有一個函數作爲屬性值。這個方法是否是創建該實例的類的原型對象的自有屬性並不重要。

+0

這個構建方法在類中是否會成爲反模式,我應該將它分離到另一個函數中嗎? –

+0

'build'對我來說聽起來像一個'static'方法(即'var newInstance = MyClass.build(...)'),但是你寫它的方式(或者我寫在我的答案中),它只是一個實例方法,並且在課堂上完全沒問題 – Bergi

+0

謝謝!這給了我前進的信心。我將不得不在後面詳細閱讀這些內容,只是想了解新的功能。 –