ES6中如何获取类函数的引用?

10

如果问题太简单的话,我很抱歉,可能是我漏掉了某些东西。 我刚刚将一个看起来像这样的ES5模块转换为:

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

将以下ES6类进行翻译:

给定一个长这样的ES6类:

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

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

然而,我有一个接收模块函数来调用的函数:

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
在两种情况下,打印出mod.func1的值都返回[Function],但显然从ES6类中返回了其他内容。
我做错了什么,如何获得可以在另一个函数中调用的类函数?
更新:使用第二个实现时,我忘记添加实例化代码:
import Mod from 'module';
var mod = new Mod();

1
我真的怀疑mod.func1(a, b)能够与导出的类一起使用。 - Bergi
忘记了实例化代码 - 现在已添加。谢谢。 - Traveling Tech Guy
1
嗯,将mod.func1方法作为函数传递到其他地方需要处理回调中的this上下文问题,但是当从对象切换到类实例时,这不应该改变。你能展示一下你的函数体吗? - Bergi
2个回答

7
class MyClass {
  method(args) {}
}

缩写意为:

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

你需要找的是构造函数上的一个静态方法,在ES3和ES5中可以这样实现:

在构造函数上添加static关键字即可。

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) {}

创建一个实例可以让您访问原型上的方法。


谢谢您的建议。但是如果“class”只是语法糖,为什么函数的可访问性会有所不同呢? - Traveling Tech Guy
谢谢Sean。我更新了我的问题以展示实例化代码 - 但那也没用:(。顺便说一下,如果你确实想要在类名上调用一个方法,你可以在函数定义时添加static - Traveling Tech Guy
正确 - 我无法在 Babel 中重现这个问题 - 当我实例化该类时,我得到了预期的行为。您是否有关于如何编译/运行此代码的更多详细信息(或者提供更详细的代码片段也可能有帮助)。 - Sean Vieira
我正在使用Babel进行转译,我遇到了一个问题,无法将类函数传递到Passport中间件。代码太复杂了,无法发布。但是你说你已经成功地让像我这样的例子工作了吗?如果是这样,那一定是我做错了什么。 - Traveling Tech Guy

4

为什么你要转向使用 class 构造函数(它不仅仅是语法糖,还包括构造函数和方法原型)?其实并没有必要放弃之前使用的对象字面量 - 你也可以在其中使用方法语法:

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

不要使用“static”方法导出对象,最好在此处使用命名导出。

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

如果您想将其作为命名空间使用,可以通过import * as mod from 'module'导入它。


2
我不明白为什么每个人都觉得他们必须尽可能多地使用ES6功能,即使这并没有意义。箭头函数也是如此...然后“突然间”,它并不能按预期工作。 - Felix Kling
6
我不介意它不能工作,我想知道为什么它不能工作。 - Traveling Tech Guy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接