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的这部分设计有点古怪(我的观点)。他们显然想通过只输出一个顶级符号来完成所有事情,这意味着他们必须在其中塞进其他一些事情,而这些事情通常可以用更普通的方式来完成。一旦你理解了,它就不难使用,只是不像传统的理解。