【问题标题】:Are certain node objects inheriting from two classes?某些节点对象是否继承自两个类?
【发布时间】:2018-01-06 21:46:11
【问题描述】:

在节点guide,它说:

"传入处理程序的请求对象实现 ReadableStream 接口。”

不过后来也说了

“注意:请求对象是 IncomingMessage 的一个实例。”。

那么request 也是 IncomingMessage 的实例,并且它还实现了 RedableStream 接口? 你将如何在 JS 中实现这一点? 还有,我以为JS里没有接口?

【问题讨论】:

  • 如果您想了解更多和更深入地了解,也许已经阅读了源代码? github.com/nodejs/readable-stream
  • @timothyclifford 还不错,但由于我不是很有经验的 JS 开发人员,所以我认为有人可以在这里稍微分解一下,或者只是解释一下我提到的在节点中如何完成的“一些”基础知识。跨度>
  • 一个对象既可以“实现”也可以“成为”某事物的实例。界面是用于文档的,不是真实的。
  • @elclanrs 在 JS 中对吗?你能链接到一些关于 JS 用于实现这一目标的部分的材料吗?
  • 在JS中,实现和接口意味着它具有某些属性和方法,通常是猴子修补到对象中。成为某事的实例意味着obj instanceof Something 是真的。

标签: javascript node.js


【解决方案1】:

如果您查看node.js source for an http incoming message,您会看到:

/* Abstract base class for ServerRequest and ClientResponse. */
function IncomingMessage(socket) {
  Stream.Readable.call(this);
  ....
}

还有这个:

util.inherits(IncomingMessage, Stream.Readable);

这表明IncomingMessage 构造函数继承自Stream.Readable。它还重写了一些可读的方法来修改它们的行为。

你将如何在 JS 中实现这一点?

您将创建自己的对象,该对象继承自另一个对象。

【讨论】:

  • 啊,所以 request 是 IncomingMessage 的实例,它继承自 Stream.Readable - 就是这样?
  • @johna - 是的,基本上就是这样。可以看到 IncomingMessage 对象的创建位置here
【解决方案2】:

一个对象既可以“实现”也可以“成为”某事物的实例,但接口仅用于文档目的。

在 JS 中,成为某事的实例意味着obj instanceof Something 为真。

在 JavaScript 等动态语言中,实现接口意味着对象应该具有某些方法。这通常称为duck-typing

如果 IncommingMessage 的行为类似于 ReadableStream,并且可以用作 ReadableStream,那么它必须是 ReadableStream。

【讨论】:

  • 除了在 IncomingMessage 的情况下,它实际上继承自 ReadableStream。常规 Javascript 继承。
  • 好点。所以在这种情况下它只是一个原型链。我想从概念上讲,当我在动态语言中阅读“实例”时,我认为是继承,而“实现”我认为是鸭子类型,不一定是继承链。
猜你喜欢
  • 1970-01-01
  • 2012-08-27
  • 2011-03-06
  • 1970-01-01
  • 2020-10-09
  • 2013-04-19
  • 1970-01-01
  • 1970-01-01
  • 2012-10-09
相关资源
最近更新 更多