Как получить ссылку на функцию класса в 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).

однако у меня есть функция, которая получает функцию модуля для вызова:

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] в обоих случаях, но явно что-то еще возвращается из класса ЕС6.

что я делаю неправильно, и как я могу получить функцию класса, которую я могу вызвать в другой функции?

обновление: со второй реализацией я забыл добавить код экземпляра:

import Mod from 'module';
var mod = new Mod();

2 ответов


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 construct (что немного больше, чем синтаксический сахар для конструктора и прототипа с методами)? Нет причин не использовать объектный литерал, как вы это делали раньше - вы также можете использовать синтаксис метода:

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

вместо экспорта объекта со "статическими" методами было бы разумнее использовать именованный экспорт здесь, хотя:

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

что можно импортировать import * as mod from 'module' Если вы хотите использовать mod as пространство имен.