Я бы сказал, что это вообще антипаттерн - зачем Foo знать о каких-то аргументах и функциях, если всё, что она делает - это выводит сообщение в консоль.
Правильно было бы сделать так:
function log (message){
console.log(message);
}
function sum (arg1, arg2){
return arg1+arg2;
}
function mult (arg1, arg2){
return arg1*arg2;
}
log(sum(2, 3));
log(mult(2, 3));
Попробуйте привести более реальный пример, где такое поведение может понадобиться.
Это модель. В реальном примере функция Foo могла бы быть единственно экспортируемой из модуля. И конечно в ней была бы не одна инструкция, плюс вызовы других функций и тд. Пользователь модуля мог-бы менять его внутреннюю реализацию отправляя на вход свою функцию (sum, mult или что-то совершенно иное). Если учитывать что функции в JS тоже являются объектами, то получается что мы меняем реализацию методов объекта не имея доступа к его коду. Это полиморфизм?
Это что-то между композицией и полиморфизмом. Конкретная реализация может быть ближе к одному или другому краю спектра, но более правильное решение, на мой взгляд - композиция.
Если у вас есть какая-то бизнес логика, выполняющаяся внутри объекта, но не являющаяся его частью, значит - эта логика должна быть в отдельной сущности и тогда это чистая композиция.