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