const io = require('socket.io')();
// or
const Server = require('socket.io');
const io = new Server();
我对以下语法感到困惑
1( 什么是socket.io(它是一个类还是接口我在node.js中查看了文档,它显示为接口(
2( 如果它是接口,我认为我们必须使用类来使用它(我没有看到任何用javascript实现接口的文档(
3( 为了理解,我尝试了以下(创建了2个文件(
example.js
module.exports = function () {
console.log("welcome to javascript");
}
使用.js
let imp = require('./example')()
从以下链接中,我了解到需要[https://nodejs.org/en/knowledge/getting-started/what-is-require/][1]
现在我很困惑socket是如何实现的,以及下面两个语法是如何相等的
如果套接字是我们可以通过调用的函数
const io = require('socket.io')();
如果它是一个类,我们通常会做以下操作(创建一个实例并使用它(
const Server = require('socket.io');
const io = new Server();
但在文件中,他们说两种语法是相等的,怎么回事?
一个用于计算模块导出,另一个用于实例化一个类,说明两者如何相等
执行此操作时:
let x = require('someModule');
x
的值是模块在模块中将module.exports
的值设置为的值。它可以是任何东西。这完全取决于模块分配给它的内容。它通常是一个对象(具有属性(,但也可以是一个函数,有时甚至是一个具有属性的函数。
要查看socket.io为module.exports
分配了什么,我们可以直接转到我们看到的源:
module.exports = Server;
那么,我们来看看什么是Server
,并找到这个:
function Server(srv, opts){
if (!(this instanceof Server)) return new Server(srv, opts);
if ('object' == typeof srv && srv instanceof Object && !srv.listen) {
opts = srv;
srv = null;
}
opts = opts || {};
this.nsps = {};
this.parentNsps = new Map();
this.path(opts.path || '/socket.io');
this.serveClient(false !== opts.serveClient);
this.parser = opts.parser || parser;
this.encoder = new this.parser.Encoder();
this.adapter(opts.adapter || Adapter);
this.origins(opts.origins || '*:*');
this.sockets = this.of('/');
if (srv) this.attach(srv, opts);
}
从中我们可以看出,它是一个构造函数,可以被调用为:
const x = new Server(...);
或作为:
const x = Server(...);
因此,答案如下:
require('socket.io')
为您提供了一个构造函数。
该构造函数可以用new
调用,也可以只是作为一个常规函数调用,它可以调整为返回相同的东西,一个新的服务器对象。
所以,当你这样做的时候:
const server = require('socket.io')();
它首先获取导出的构造函数,然后调用它并将新创建的对象分配给CCD_ 7变量。
1(什么是socket.io(它是一个类还是接口我在node.js中查看了文档,它应该是接口(
服务器上的
socket.io导出一个用于创建服务器对象的构造函数。它既可以作为正则函数调用,也可以用new
调用。
2(如果它是接口,我认为我们必须使用类来使用它(我没有看到任何用javascript实现接口的文档(
这是一个函数。Javascript没有称为接口的特定类型。socket.io代码以老式的方式(在class
关键字存在之前(定义构造函数,尽管结果基本相同。它定义了一个构造函数,当被调用时,它将创建所需类型的对象。
3(现在我很困惑套接字是如何实现的,以及以下两种语法是如何相等的
在Javascript中,这两段不同的代码创建了相同的server
对象:
const io = require('socket.io');
const server = io();
和
const server = require('socket.io')();
第二种方法只是一种快捷方式,它不将require('socket.io')
的中间结果分配给变量,而是直接调用它。只有当第一个函数调用返回一个函数时,它才会像这样工作。因此,第一个语法获得一个函数,将其分配给io
变量,然后调用它。第二个语法获得该函数,并立即调用它,而不将其分配到变量。在这两种情况下,获取函数并调用它的结果都会出现在server
变量中。