Композиция функций: Дополнение существующей функции дополнительной функцией в Javascript

1

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

Исходная функция может быть logThis:

function logThis() {console.log('this'));

Я могу создать новую функцию, которая выполняет logThis, а затем записывает 'that';

function logThisThenThat() {
  logThis();
  console.log('that');
}

Я хотел бы заменить logThis новой функцией, которая выполняет исходную функцию, а затем другую функцию? Возможно ли это с помощью композиции функций, или мне придется создавать новую функцию с другим именем, которая состоит из исходной функции и дополнительных функций.

Что-то вроде:

logThis = compose(logThis, logThat);
Теги:
function-composition

3 ответа

1
Лучший ответ

Если вы передадите logThis() в функцию compose(), вы будете хранить ссылку на нее в замыкании, поэтому она будет действовать, когда вы logThis() новый logThis(). Имя на самом деле не так важно, если вы переименуете его в порядке, который позволяет вам получить ссылку на старый logThis() прежде чем указывать имя новой функции. Например, правая часть logThis = compose(logThis, logThat) выполняется перед назначением имени ниже, поэтому вы logThis = compose(logThis, logThat) на функцию перед переназначением имени:

function logThis() {console.log('this')};
function logThat() {console.log('that')};

let compose = (f1, f2) => () => {
    f1()
    f2()
}

logThis = compose(logThis, logThat)
logThis()
  • 0
    отлично ... это именно то, что я искал. Можно ли заставить эту работу с n функций, а не только две? хотя в моем текущем случае использования мне понадобятся только две, и я мог бы просто добавить больше функций одну за другой.
  • 1
    Да @DennisBauszus, вам просто нужно передать массив функций или захватить все аргументы. Что-то вроде let compose = (...fns) => () => fns.forEach(f=>f())
Показать ещё 1 комментарий
1

Вы можете создать такую функцию.

function logThis() {
	console.log("this");
}

function logThat() {
	console.log("that");
}

let compose = (...func) => ()=> {
	let functions = func;
	functions.forEach((fn) => fn());
}

logThis = compose(logThis, logThat);
logThis();

Добавив (...func) качестве параметров, вы можете выполнить 3, 4 любого количества функций, которые вам нравятся/нужны.

Примечание. Отредактируйте фрагмент в соответствии с вопросом. Выбранный ответ @mark-meyer правильный.

1

Вы можете переопределить существующую функцию новой.

Сохраните копию оригинала, как это...

_logThis = logThis;

... а затем заставьте вашу новую версию назвать оригинальную...

function logThis() {
    _logThis();
    // your other function call or new code goes here
}

Однако это не очень хорошая идея, так как это изменит то, что происходит для каждого существующего вызова этого метода. С этим нужно обращаться осторожно.

Кроме того, сфера является важным фактором здесь. Это основной пример того, что вы пытаетесь сделать.

  • 0
    Это именно то, что я сделал, и это работает. Я думал, что это выглядит довольно питонно, и что там может быть другой более javascripty метод там.
  • 0
    Я сомневаюсь, что вы когда-нибудь увидите, что расширение функций является нативной вещью, поскольку это так просто сделать. Я уверен, что есть сторонние библиотеки, которые делают его пушистым, но это будет ^^ на самом низком уровне.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню