Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当我需要时;快报;我需要知道它是一个对象还是一个函数_Javascript_Node.js_Express - Fatal编程技术网

Javascript 当我需要时;快报;我需要知道它是一个对象还是一个函数

Javascript 当我需要时;快报;我需要知道它是一个对象还是一个函数,javascript,node.js,express,Javascript,Node.js,Express,根据我的密码 const express = require("express") const app = express() console.log(typeof app) console.log(typeof express) 我的终端告诉我这两个变量都是函数 这对我来说毫无意义,因为我可以像访问对象一样访问每个属性,但当我在console.log中执行typeof时,我的终端告诉我它们都是函数 有人能给我解释一下这些变量是什么,为什么可以像访问对象一样访问它们的属性?根据,expre

根据我的密码

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


console.log(typeof app)
console.log(typeof express)
我的终端告诉我这两个变量都是函数

这对我来说毫无意义,因为我可以像访问对象一样访问每个属性,但当我在console.log中执行typeof时,我的终端告诉我它们都是函数

有人能给我解释一下这些变量是什么,为什么可以像访问对象一样访问它们的属性?

根据,express()函数是由express模块导出的顶级函数

它类似于拥有
对象
。您正在声明的变量
express
充当
,而变量
app
是所使用的
对象

当我需要“express”时,我需要知道它是一个对象还是一个函数

两者都有。Javascript中的函数是对象

在没有技术支持的情况下,
express
是一个创建应用程序实例的工厂函数,
app
是一个express实例。现在,从技术上讲,
express
app
都是函数。但是,Javascript中的函数是对象,可以具有属性。express对象具有静态属性。
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'
]
[
  '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'
]
而且,这:

console.log(Object.getOwnPropertyNames(app));
你会得到这个:

[
  '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'
]
[
  '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”)
我将一个“类”存储到express变量中。2) 然后当我这样做时…
express.json()
我正在访问express类中的
json()
函数

正如我在上面的回答中所说,
express
变量表示工厂函数。这是一个函数,当被调用时,它会为您创建一个对象。这是一种不同于在
newmyobj()
中直接调用构造函数的创建对象的方法
express.json
是一个函数,调用该函数时,会为您创建一个中间件函数,该函数使用您传递给该函数的参数


Express体系结构与纯类风格的体系结构略有不同。它使用一个工厂函数来创建一个实例(本质上是类的实例)。然后,
app
表示该实例,但它本身也可以充当请求处理程序。

在JavaScript中,函数也可以有属性。实际上函数也是一个对象,一个可调用的对象。例如,如果您曾经使用过jQuery,那么您已经编写过这样的内容:
$('…')
,还有
$.ajax(…)
。阅读此内容将有助于JavaScript函数是对象。好的,请告诉我这一点是否正确。1) 当我这样做时,…const express=require(“express”)我将一个“Class”存储到express变量中。2) 然后当我这样做的时候…express.jason()我正在访问express类中的jason()函数?@ooooo hyesssss-正如我在回答中所说的,
express
变量代表一个变量。这是一个函数,当被调用时,它会为您创建一个对象。这是一种不同于在
newmyobj()
中直接调用构造函数的创建对象的方法
express.json
是一个函数,调用该函数时,会为您创建一个中间件函数,该函数使用您传递给该函数的参数。Express体系结构与纯
风格的体系结构略有不同。但当我将此“工厂功能”导入app.js文档时,我可以立即访问它内部的函数,甚至不需要调用它,如图所示。const express=要求(“express”);json();通过这个简单的代码require(“express”),我是否调用了它的工厂函数?@ooooo hyesssss-No.
require(“express”)
返回工厂函数。该工厂函数还包含一些静态方法,如
express.json()
,但在通过调用工厂函数创建
app
实例之前,这些方法几乎没有什么用处。您的
express
变量对一个类来说非常有用(但是您可以通过调用它而不是使用
new
来创建该类的实例)
express.json()
就像一个类的静态方法。@ooooo-hyesssss-express的这部分设计有点古怪(我的观点)。他们显然想通过只输出一个顶级符号来完成所有事情,这意味着他们必须在其中塞进其他一些事情,而这些事情通常可以用更普通的方式来完成。一旦你理解了,它就不难使用,只是不像传统的理解。