在NodeJS

时间:2018-02-14 18:31:01

标签: javascript node.js inheritance instance prototypal-inheritance

NodeJS文档声明:

  

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

     

"到目前为止,我们还没有触及响应对象,这是一个   ServerResponse的一个实例,它是一个WritableStream。"

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

这是如何被束缚起来的以及它是如何运作的。 官方NodeJS文档没有解释。

来源 - Anatomy of an HTTP Transaction

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

1 个答案:

答案 0 :(得分:4)

接口=义务。

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

文档对此特定界面的说法是ReadableStream

好吧,here它说

  

所有可读流都实现了stream.Readable类

定义的接口

什么是stream.Readable

好吧,here一个完整的界面"已提供,它由多个成员组成,包括readpipe和其他成员。

从技术上讲,在JS中有多种方式可以实现"这样的义务:

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

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

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

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

E.g。文档说接口包含一个方法

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);
   }
}

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