Olá Rafael, tudo bem com você?
Realmente você foi numa parte bem complexa do javascript, onde temos que funções também são objetos e podem ter atributos :)
Mas voltando a sua pergunta:
Quando instanciamos o express()
o que ele nos devolve é uma função, e para te mostrar isso vou abrir o arquivo principal express.js
:
A jsdoc da função:
/**
* Create an express application.
*
* @return {Function}
* @api public
*/
Aqui já temos indicando que ao executar express()
teremos como retorno uma função, mas vamos ver de fato o método:
function createApplication() {
var app = function(req, res, next) {
app.handle(req, res, next);
};
mixin(app, EventEmitter.prototype, false);
mixin(app, proto, false);
// expose the prototype that will get set on requests
app.request = Object.create(req, {
app: { configurable: true, enumerable: true, writable: true, value: app }
})
// expose the prototype that will get set on responses
app.response = Object.create(res, {
app: { configurable: true, enumerable: true, writable: true, value: app }
})
app.init();
return app;
}
Então veja que o retorno da função express()
é uma nova função que foi atribuída a app
, podemos perceber que são criados atributos dentro dessa função, mas de fato o tipo retornado é uma função
Essa parte de funções serem objetos, é um pouco complexa da linguagem, e existe bastante coisa para estudar para compreender afundo, mas basicamente é isso :)
Um exemplo mais simples:
function saudar(nome){
console.log(`Olá ${nome}, tudo bem?`)
}
saudar.idade = 50;
console.log(saudar.idade); ---> 50
console.log(typeof saudar); --> function
Abraços e Bons Estudos!