В иерархии объектов Javascript функция является типом объекта.Мало того, что функция может быть вызвана, но она также может иметь свойства, как обычный объект.Вы можете думать об этом как о том, что объект функции наследуется от простого объекта.
Итак, в случае express
в вашем примере это функция и она также имеет свойства.
Итак, вы можете вызвать ее напрямую:
var app = express();
И вы можете получить доступ к его свойствам:
var router = express.Router();
Вы можете сделать это с помощью своих собственных функций:
function myFunc() {
console.log("hello");
}
myFunc(); // outputs "hello"
myFunc.greeting = "goodbye";
console.log(myFunc.greeting); // outputs "goodbye"
И вы можете даже объединить их так:
function myFunc() {
console.log(myFunc.greeting);
}
myFunc.greeting = "goodbye";
myFunc(); // outputs "goodbye"
Обратите внимание, библиотека Express не должна была проектировать ее так, как она это делала.Они могли бы экспортировать простой объект с несколькими свойствами, где одно из свойств этого простого объекта было функцией express, и заставить его работать так:
const expressLib = require('express');
const app = expressLib.Express();
const server = http.createServer(app);
const router = expressLib.Router();
app.use('/', router);
Таким образом, это был просто выбор дизайна API, чтобы сделатьexpress
выполняет функцию основного экспорта и помещает свойства в эту функцию, а не экспортирует простой объект со всеми свойствами, включая функцию express.