如何在ES6中获得对类函数的引用?

对不起,如果问题太简单了,但我在这里错过了一些东西。 刚刚切换了一个如下所示的ES5模块:

module.exports = { func1: function(a, b) {...}, func2: function(a, b) {...} }; 

对于看起来像这样的ES6类:

 export default class { func1(a, b) {...} func2(a, b) {...} } 

一切都很好:在这两种情况下,我都可以export mod from 'module'; 并调用mod.func1(a, b)mod.func2(a, b)

但是,我有一个function,接收模块函数来调用:

 var caller = function(func, val1, val2) { let a = something(val1); let b = something(val2); return func(a, b); }; 

当我调用调用caller(mod.func1, x, y)我得到了第一个实现所需的结果,但undefined is not a function第二undefined is not a function

在这两种情况下,打印出mod.func1的值mod.func1返回[Function] ,但显然ES6类会返回其他内容。

我在做什么错了,我怎么能得到一个类函数,我可以调用另一个函数?

更新:第二个实现,我忘了添加实例化代码:

 import Mod from 'module'; var mod = new Mod(); 

 class MyClass { method(args) {} } 

是短暂的:

 function MyClass() {} MyClass.prototype.method = function(args){}; 

你正在寻找的是一个构造函数的static方法,在ES {3,5}中这样做:

 function MyClass() {} MyClass.method = function(args){}; 

并在ES6中完成与static修改器:

 export default class { static func1(a, b) { /* stuff */ } static func2(a, b) { /* stuff */ } } 

但是,即使在一个对象中也可以使用简短的方法,所以在一般情况下使用一个普通的对象会更清晰:

 export default { func1(a, b) {/* stuff */}, func2(a, b) {/* stuff */} } 

为什么构造函数没有可用的原型方法?

因为在ES3或ES5中不是这样:

 function MyClass() {}; MyClass.prototype.method = function(args) {}; MyClass.method // undefined var instance = new MyClass(); instance.method // function(args) {} 

创build一个实例是必要的,以访问原型上的方法。

为什么你改用一个class构造(这比构造函数的语法糖和这个方法的原型多一点)? 没有理由不像以前那样使用对象字面值 – 你也可以在那里使用方法语法:

 export default { func1(a, b) {...}, func2(a, b) {...} }; 

不是用“静态”方法导出一个对象,而是使用命名的导出来更合理:

 export function func1(a, b) {...} export function func2(a, b) {...} 

如果你喜欢使用mod作为命名空间,你可以通过import * as mod from 'module'