首页 > 解决方案 > 使用对象作为函数

问题描述

我有一个关于使用快速应用程序对象(app 对象)作为回调函数的问题。据我所知,快速应用程序是一个对象,它具有帮助路由 HTTP 请求的方法和属性。要将 app 对象与 HTTP 服务器一起使用,我们将其用作该服务器的回调函数:

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

Router 对象也是如此:

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

我想知道如何将对象视为函数。确实,函数继承自 Object 类,但据我所知,它没有像它应该在快速应用程序中那样的方法和属性。

标签: javascriptnode.jsexpress

解决方案


在 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 设计选择。


推荐阅读