很抱歉,问题太简单了,但我在这里遗漏了一些东西。 刚刚切换了一个看似如下的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)
。
但是,我有一个函数可以接收一个模块函数来调用:
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();
答案 0 :(得分:6)
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) {}
创建实例是必要的,可以访问原型上的方法。
答案 1 :(得分: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'
作为命名空间,可以mod
导入。