如何在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'
。