Javascript 在NodeJS中实现接口

Javascript 在NodeJS中实现接口,javascript,node.js,inheritance,instance,prototypal-inheritance,Javascript,Node.js,Inheritance,Instance,Prototypal Inheritance,NodeJS文档说明: “请求对象是IncomingMessage的实例。请求 传递给处理程序的对象实现ReadableStream 接口“ “到目前为止,我们还没有涉及到响应对象,它是一个 ServerResponse的实例,它是一个可写流。“ JS有原型继承,所以当文档说它是 实例这意味着它将添加到原型链中,但它是如何添加的 在JS中实现接口 这一切是如何联系在一起的,它是如何运作的。 官方的NodeJS文档没有解释 来源- 编辑-我的问题与JS中的多重继承无关。它是关于NodeJS模块如何

NodeJS文档说明:


“请求对象是IncomingMessage的实例。请求 传递给处理程序的对象实现ReadableStream 接口“

“到目前为止,我们还没有涉及到响应对象,它是一个 ServerResponse的实例,它是一个可写流。“

JS有原型继承,所以当文档说它是 实例这意味着它将添加到原型链中,但它是如何添加的 在JS中实现接口

这一切是如何联系在一起的,它是如何运作的。 官方的NodeJS文档没有解释

来源-


编辑-我的问题与JS中的多重继承无关。它是关于NodeJS模块如何实现JS本机不支持的接口的。如果我的问题有任何错误或缺乏知识,请原谅。谢谢

接口=义务

实现接口=提供呼叫您的人期望的成员

文档对这个特殊的接口,
ReadableStream
有何评论

嗯,上面说

所有可读流都实现stream.Readable类定义的接口

什么是
流。可读的

那么,提供了一个完整的“接口”,它由多个成员组成,包括
read
pipe

从技术上讲,JS中有多种“履行”此类义务的方式:

  • 一个简单的方法是在一个应该实现接口的对象的原型链中设置一个已经实现接口的对象。这样,所有接口成员(通过proto链)都被委托给另一个对象

  • 一种更直接的方法是直接由应该实现接口的对象提供所有必要的成员

  • 一种混合方法,其中一些成员在原型链下被委派,一些成员直接实现,一些成员通过直接调用被委派给其他对象

  • // an object that already implements the interface
    // i.e. has function foo(n)
    var existing = ....; 
    
    var o = {
       foo: function(n) {
           return existing(n);
       }
    }
    
由于语言的性质,期望实现接口的调用方将接受所有这些可能性

例如,文档说界面包含一个方法

foo(n)
where n is a number 
returns a number
您有以下选项

备选方案1,直接实施

var o = {
    foo: function(n) {
       return 0;
    }
}
选项2,从原型链向下委派

// an object that already implements the interface
// i.e. has function foo(n)
var existing = ....; 

var o = Object.create(existing);

// o has function foo though its proto
备选案文3,通过调用进行授权

// an object that already implements the interface
// i.e. has function foo(n)
var existing = ....; 

var o = {
   foo: function(n) {
       return existing(n);
   }
}

所有这些选项也可以用构造函数表示。

可能与“实现ReadableStream接口”重复,这意味着它实现(或继承)相同的方法。JS中没有命名类型系统。至于如何从JS中的构造函数继承,有一百万个教程。在传统的面向对象编程(如Java)中,它实现了基于类的继承、类的扩展和接口的实现。然而JS实现了原型继承。在JS中,继承意味着简单地添加到对象的直接原型链中。我还没有在JS中实现接口,这就是我提出这个问题的原因。很抱歉,但是您的评论没有任何帮助。@WittyHumour语言中没有强制执行接口的内容。当文档中说“实现ReadableStream接口”时,这意味着你作为一个人将去阅读ReadableStream的文档,而你作为一个程序员同意编写你的代码,这样当其他程序员使用你的对象时,它将看起来像一个ReadableStream对象。这只是人类之间的非正式协议。不是语言特性请求对象是IncomingMessage的实例,它实现了ReadableStream接口。你能用JavaScript在上下文中解释一下吗?你能用一种初学者(像我一样)能理解的方式解释得更清楚些吗?@WittyHumour:经过编辑并提供了更多背景,问题是,您仍然要求更清晰,但没有缩小理解上的问题。@WittyHumour:在纯JS中,没有办法以您习惯的方式表达接口,因此编译器将告诉您可能缺少的成员。在纯JS中,表达接口的唯一方法是在文档中写下它的成员,并祈祷“实现”它的人能够真正实现所有成员。是TypeScript引入了在编译时检查的接口,然而TypeScript编译为纯JS。看看我创建的示例:goo.gl/hUqw7j@WittyHumour:如您所见,该接口在编译过程中被完全删除。这个例子的要点是,JS开发人员经常使用TS来表示元数据(类型和接口),明确类型的repo的整个思想是为许多JS框架(包括node.JS等)提供元数据,因此,通过说“接口”,人们通常指的是类型化合同的TS规范。去那里搜索ReadableStream。@WittyHumour:没问题。下一次当你有具体的问题,希望人们帮助你时,试着更具体地说明你没有得到什么。我的印象是,你重复了第四次或第五次“你不明白”,但具体是哪一部分,仍然不清楚。