javascript - 使用对象作为函数
问题描述
我有一个关于使用快速应用程序对象(app 对象)作为回调函数的问题。据我所知,快速应用程序是一个对象,它具有帮助路由 HTTP 请求的方法和属性。要将 app 对象与 HTTP 服务器一起使用,我们将其用作该服务器的回调函数:
var app = express();
// ...
var server = http.createServer(app);
Router 对象也是如此:
var app = express();
var router = express.Router();
// ...
app.use('/', router);
我想知道如何将对象视为函数。确实,函数继承自 Object 类,但据我所知,它没有像它应该在快速应用程序中那样的方法和属性。
解决方案
在 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);
express
因此,将函数作为主要导出并将属性放在该函数上,而不是导出一个包含所有属性(包括 express 函数)的普通对象,这只是一种 API 设计选择。
推荐阅读
- vb.net - 如何在 VB.NET 项目中对应用程序启动表单列表进行排序
- ruby - ActiveJob rescue_from 返回成功而没有提升和失败
- php - 学说合并没有按预期工作
- c++ - 重启系统后我的dll服务消失了
- python - 在某些单词之后拆分或分区字符串
- wordpress - Vue.js Axios Wordpress 调用
- azure - Azure 函数抛出 Microsoft.AspNetCore.Server.Kestrel.Core:已添加具有相同密钥的项
- github - GitHub 声称已经有 11 亿的贡献。什么是贡献?
- java - Minio Gradle 依赖 android javax.annotation.CheckReturnValue
- php - AJAX 在 localhost 中有效,但在实时网络中无效