В руководстве узла говорится, что:
"Объект запроса, который передается обработчику, реализует интерфейс ReadableStream".
Однако впоследствии он также говорит, что
"Примечание: объект запроса является экземпляром IncomingMessage.".
Итак, как request
также является экземпляром IncomingMessage, а также реализует интерфейс RedableStream? Как бы вы это достигли в JS? Кроме того, я думал, что в JS нет интерфейсов?
Если вы посмотрите на источник node.js для входящего сообщения http, вы увидите следующее:
/* 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 - и все?
Объект может как "реализовать", так и "быть экземпляром", но интерфейс предназначен только для целей документирования.
В JS, чтобы быть экземпляром чего-то, означает, что obj instanceof Something
истинно.
В динамических языках, например JavaScript, для реализации интерфейса означает, что объект должен иметь определенные методы. Это обычно называют утиным типом.
Если IncommingMessage ведет себя как ReadableStream и может использоваться как ReadableStream, тогда он должен быть ReadableStream.