Permítanme comenzar con algunas declaraciones.
-> (Object instanceof Function) porque el constructor de objetos es una función
-> (Function instanceof Object) porque las funciones son objetos
Ahora mi pregunta es: ¿Cómo puedo simular el comportamiento del objeto express.js ?
const express = require("express");
const app = express(); // express here is a function
app.use(express.json()) // now here express is an object
Esto funciona bien en nodejs y creía que express es básicamente un objeto y cuando llamas a express() haces referencia al constructor del objeto.
Sin embargo, las cosas parecen ser un poco diferentes.
Intentar considerarlo como una clase también fallará porque no lo instancias como new .
Y, si intentas simularlo como una función, no puedes simularlo como un objeto.
He adjuntado 3 de mis intentos de simular este comportamiento
// Trying to simulate it with a function
var express = () => {
this.json = () => {console.log("json")}
return {
listen : () =>{ console.log("listen !") },
use : () =>{ console.log("use !") }
}
}
const app = express(); // ok
app.listen(); // ok
app.use(); // ok
express.json(); // fail
// Trying to simulate it with a class
class express{
constructor(){
return {
listen : () => { console.log("listen !") },
use : () => { console.log("use !") }
}
}
json(){console.log("json")}
}
const app = express(); // Class constructor express cannot be invoked without 'new'",
app.listen();
app.use();
express.json(); // not instanciated
// Trying to simulate it as an object
var express = {
constructor : ()=>{ // does not overwrite constructor
return {
listen : () =>{ console.log("listen !") },
use : () =>{ console.log("use !") }
}
},
json : ()=>{console.log("json")}
}
const app = express(); // "message": "Uncaught TypeError: express is not a function",
app.listen();
app.use();
express.json()