【问题标题】:How to get a reference to a class function in ES6?如何在 ES6 中获取对类函数的引用?
【发布时间】:2015-08-01 20:05:18
【问题描述】:

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

【问题讨论】:

  • 我真的怀疑mod.func1(a, b) 是否适用于导出的类。
  • 忘记了实例化代码 - 现在添加了。谢谢。
  • 嗯,将mod.func1 方法作为函数传递到其他地方需要您处理this context in callbacks 问题,但是从对象切换到类实例时也不应该改变。你能告诉我们你的函数体吗?

标签: javascript node.js ecmascript-6 es6-module-loader


【解决方案1】:
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) {}

必须创建实例才能访问原型上的方法。

【讨论】:

  • 感谢您的建议。但如果class 只是糖,为什么函数可访问性有差异?
  • 谢谢肖恩。我更新了我的问题以显示实例化代码-但这也不起作用:(。顺便说一句,如果您确实想在类名上调用方法,可以在函数定义中添加static
  • 正确 - 我无法在 babel 中重现这一点 - 当我实例化类时,我得到了预期的行为。有关如何编译/运行它的更多详细信息(或更详细的 sn-p 也可能有帮助)。
  • 我正在使用 Babel 进行转译,我在将类函数传递到 Passport 中间件时遇到问题。代码太复杂,无法发布。但是你是说你已经设法得到一个像我这样的例子吗?如果是这样,那一定是我做错了什么。
【解决方案2】:

您为什么改用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' 导入。

【讨论】:

  • 我不明白为什么每个人都认为他们必须尽可能多地使用 ES6 功能,即使这没有意义。箭头函数也是如此......并且“突然”它无法按预期工作。
  • 我对它不起作用没有问题 - 我想了解它为什么不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-16
相关资源
最近更新 更多