在 NodeJS 中实现接口

Moh*_*him 3 javascript inheritance instance prototypal-inheritance node.js

NodeJS 文档指出:

“请求对象是 IncomingMessage 的一个实例。传入处理程序的请求对象实现了 ReadableStream 接口”

“到目前为止,我们根本没有触及响应对象,它是 ServerResponse 的一个实例,它是一个 WritableStream。”

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

以及这一切是如何联系起来的以及它是如何工作的。官方 NodeJS 文档没有解释。

来源 - HTTP 事务剖析

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

Wik*_*hla 5

接口 = 义务。

实现一个接口 = 提供那些打电话给你的人所期望的成员。

文档对这个特定界面的评价是ReadableStream什么?

嗯,这里

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

什么是stream.Readable

好吧,这里提供了一个完整的“接口”,它由多个成员组成,包括readpipe和其他人。

从技术上讲,在 JS 中有多种“实现”这种义务的方式:

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

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

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

由于语言的性质,期望实现接口的调用者将接受所有这些可能性。

例如文档说接口包含一个方法

foo(n)
where n is a number 
returns a number
Run Code Online (Sandbox Code Playgroud)

您有以下选择。

选项 1,直接实现

var o = {
    foo: function(n) {
       return 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

选项 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
Run Code Online (Sandbox Code Playgroud)

选项 3,调用委托

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

var o = {
   foo: function(n) {
       return existing(n);
   }
}
Run Code Online (Sandbox Code Playgroud)

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