9

对不起,如果问题太简单了,但我在这里遗漏了一些东西。刚刚切换了一个看起来像这样的 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)and 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();
4

2 回答 2

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

创建实例对于访问原型上的方法是必要的。

于 2015-08-01T20:13:37.650 回答
4

为什么要切换到class构造(它不仅仅是构造函数和带有方法的原型的语法糖)?没有理由不像以前那样使用对象字面量 - 您也可以在其中使用方法语法:

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

与其使用“静态”方法导出对象,不如在这里使用命名导出更合理:

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

import * as mod from 'module'如果您想用作命名空间,您可以导入它mod

于 2015-08-01T21:07:15.100 回答