когда мне требуется «экспресс», мне нужно знать, является ли это объектом или функцией

Учитывая мой код

const express = require("express")
const app = express()


console.log(typeof app)
console.log(typeof express)

Мой терминал говорит мне, что обе эти переменные являются функциями!

Это не имеет смысла для меня, потому что я могу получить доступ к свойствам каждого из них, как если бы они были объектами, и все же, когда я делаю typeof в console.log, мой терминал говорит мне, что они являются функциями.

Может кто-нибудь объяснить мне, что эти переменные и почему можно получить доступ к их свойствам, как если бы они были объектами?

Всего 3 ответа


когда мне требуется «экспресс», мне нужно знать, является ли это объектом или функцией

Это оба. Функции в Javascript являются объектами.

Не вдаваясь в технические express , express - это фабричная функция, которая создает экземпляр app а app - экземпляр express. Технически, и express и app теперь являются функциями. Но функции в Javascript являются объектами и могут иметь свойства. Экспресс-объект имеет статические свойства. Объект app многом похож на экземпляр класса Express. Он имеет как методы, так и данные экземпляра.

Теперь, немного более технический ...

const express = require('express') возвращает вам функцию, и эта функция также является объектом и имеет свойства.

Эта конкретная функция является фабричной функцией, которая создает объект app при вызове, который также является функцией со свойствами.

Таким образом, express также имеет свойства, которые можно использовать, такие как:

express.static
express.json
express.urlencoded

И это можно назвать как в:

const app = express();

Аналогично, app - это функция, которая тоже имеет свойства. Может использоваться как функция как:

const server = http.createServer(app);
server.listen(80);

Или его можно использовать как объект, как в:

const server = app.listen(80);

Если вы выводите это:

console.log(typeof express);
console.log(typeof app);

Вы увидите это:

function
function

Они обе функции. Но функции в Javascript тоже являются объектами и могут иметь свойства.

Итак, вы можете делать такие вещи:

function myFunction() {
    return "ok";
}

myFunction.greeting = "Hello";

console.log(myFunction());                 // "ok"
console.log(myFunction.greeting);         // "Hello"

Если вы сделали следующее, посмотрите на express и app :

console.log(Object.getOwnPropertyNames(express));

Вы получите это:

[
  'length',         'name',
  'prototype',      'application',
  'request',        'response',
  'Route',          'Router',
  'json',           'query',
  'raw',            'static',
  'text',           'urlencoded',
  'bodyParser',     'compress',
  'cookieSession',  'session',
  'logger',         'cookieParser',
  'favicon',        'responseTime',
  'errorHandler',   'timeout',
  'methodOverride', 'vhost',
  'csrf',           'directory',
  'limit',          'multipart',
  'staticCache'
]

И это:

console.log(Object.getOwnPropertyNames(app));

получил бы это:

[
  'length',          'name',            'prototype',
  'constructor',     '_events',         '_eventsCount',
  '_maxListeners',   'setMaxListeners', 'getMaxListeners',
  'emit',            'addListener',     'on',
  'prependListener', 'once',            'prependOnceListener',
  'removeListener',  'off',             'removeAllListeners',
  'listeners',       'rawListeners',    'listenerCount',
  'eventNames',      'init',            'defaultConfiguration',
  'lazyrouter',      'handle',          'use',
  'route',           'engine',          'param',
  'set',             'path',            'enabled',
  'disabled',        'enable',          'disable',
  'acl',             'bind',            'checkout',
  'connect',         'copy',            'delete',
  'get',             'head',            'link',
  'lock',            'm-search',        'merge',
  'mkactivity',      'mkcalendar',      'mkcol',
  'move',            'notify',          'options',
  'patch',           'post',            'propfind',
  'proppatch',       'purge',           'put',
  'rebind',          'report',          'search',
  'source',          'subscribe',       'trace',
  'unbind',          'unlink',          'unlock',
  'unsubscribe',     'all',             'del',
  'render',          'listen',          'request',
  'response',        'cache',           'engines',
  'settings',        'locals',          'mountpath',
  'router'
]

Итак, вы можете видеть, что у каждого из них есть много свойств в дополнение к функциям.


Хорошо, пожалуйста, скажите мне, если я правильно понял. 1) Когда я делаю это… const express = require(“express”) я сохраняю «Class» в переменной express. 2) Затем, когда я делаю это… express.json() я получаю доступ к функции json() внутри класса express?

Как я уже сказал в моем ответе выше, эта переменная представляет фабричную функцию. Это функция, которая при вызове создает объект для вас. Это другой способ создания объекта, чем прямой вызов конструктора, как в new myObj() . express.json - это функция, которая при вызове создает для вас функцию промежуточного программного обеспечения, которая использует параметры, которые вы передали функции.

Архитектура Express немного отличается от архитектуры стиля чистого класса. Он использует фабричную функцию, которая создает экземпляр (по существу, класса). И затем app представляет этот экземпляр, но также работает как обработчик запросов самостоятельно.


Согласно документам , функция express () является функцией верхнего уровня, экспортируемой модулем express.

Это похоже на Class и Object . Переменная express которую вы объявляете, действует как class , а переменная app является object ее использования.


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

Пожалуйста, проверьте суть