Использование объекта в качестве функции - PullRequest
0 голосов
/ 21 июня 2019

У меня есть вопрос, связанный с использованием экспресс-объекта приложения (приложения) в качестве функции обратного вызова.Из того, что я знаю, экспресс-приложение - это объект, который имеет методы и свойства, помогающие в маршрутизации HTTP-запросов.Чтобы использовать объект приложения с сервером HTTP, мы используем его в качестве функции обратного вызова для этого сервера:

var app = express();
// ...
var server = http.createServer(app);

То же самое относится и к объекту маршрутизатора:

var app = express();
var router = express.Router();
// ...
app.use('/', router);

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

1 Ответ

0 голосов
/ 21 июня 2019

В иерархии объектов 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...