2016-09-22 79 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

谢谢!这给了我前进的信心。我将不得不在后面详细阅读这些内容,只是想了解新的功能。 –