Javascript 将对象用作函数

Javascript 将对象用作函数,javascript,node.js,express,Javascript,Node.js,Express,我有一个关于使用express应用程序对象(app对象)作为回调函数的问题。据我所知,express应用程序是一个对象,它有方法和属性来帮助路由HTTP请求。要将app对象用于HTTP服务器,我们将其用作此服务器的回调函数: var app = express(); // ... var server = http.createServer(app); 路由器对象也是如此: var app = express(); var router = express.Router(); // ... a

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

var app = express();
// ...
var server = http.createServer(app);
路由器对象也是如此:

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

我想知道一个对象如何被看作一个函数。的确,函数继承自Object类,但据我所知,它没有express应用程序中应有的方法和属性。

在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"
const expressLib = require('express');
const app = expressLib.Express();

const server = http.createServer(app);

const router = expressLib.Router();
app.use('/', router);

请注意,Express库不必像他们那样进行设计。他们可以导出具有多个属性的普通对象,其中该普通对象上的一个属性是express函数,并使其按如下方式工作:

function myFunc() {
   console.log(myFunc.greeting);
}

myFunc.greeting = "goodbye";

myFunc();    // outputs "goodbye"
const expressLib = require('express');
const app = expressLib.Express();

const server = http.createServer(app);

const router = expressLib.Router();
app.use('/', router);

因此,将
express
函数作为主要导出并将属性放在该函数上,而不是导出包含所有属性的普通对象(包括express函数),这只是一种API设计选择。

JavaScript中的每个函数都是一个函数对象!在JavaScript中,函数是一级对象,因为它们可以像任何其他对象一样具有属性和方法。它们与其他对象的区别在于可以调用函数。简言之,它们是函数对象。你的困惑似乎部分在于
app
实际上是一个函数。这不仅仅是一个简单的对象,他们以某种方式将其视为一个函数。有人愿意解释为什么投票被否决吗?如果有必要,我很乐意改进答案。