Определенные объекты узла наследуются от двух классов?

1

В руководстве узла говорится, что:

"Объект запроса, который передается обработчику, реализует интерфейс ReadableStream".

Однако впоследствии он также говорит, что

"Примечание: объект запроса является экземпляром IncomingMessage.".

Итак, как request также является экземпляром IncomingMessage, а также реализует интерфейс RedableStream? Как бы вы это достигли в JS? Кроме того, я думал, что в JS нет интерфейсов?

  • 0
    Возможно, прочитайте исходный код, если хотите узнать больше и понять глубже? github.com/nodejs/readable-stream
  • 0
    @timothyclifford неплохо, но так как я не очень опытный разработчик JS, я подумал, что кто-то может немного разбить его здесь или просто объяснить «некоторые» основы того, как вещи, которые я упомянул, делаются в узле.
Показать ещё 6 комментариев
Теги:

2 ответа

1
Лучший ответ

Если вы посмотрите на источник 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?

Вы бы создали свой собственный объект, который наследуется от другого.

  • 0
    ну так request является экземпляром IncomingMessage, который наследуется от Stream.Readable - и все?
  • 0
    @johna - Да, вот и все. Вы можете увидеть, где объект IncomingMessage создан здесь .
0

Объект может как "реализовать", так и "быть экземпляром", но интерфейс предназначен только для целей документирования.

В JS, чтобы быть экземпляром чего-то, означает, что obj instanceof Something истинно.

В динамических языках, например JavaScript, для реализации интерфейса означает, что объект должен иметь определенные методы. Это обычно называют утиным типом.

Если IncommingMessage ведет себя как ReadableStream и может использоваться как ReadableStream, тогда он должен быть ReadableStream.

  • 0
    За исключением того, что в случае IncomingMessage, он на самом деле наследуется от ReadableStream. Обычное наследование Javascript.
  • 0
    Хорошая точка зрения. Так что в данном случае это просто цепочка прототипов. Я думаю, концептуально, когда я читаю «instance» в динамических языках, я думаю, что наследование, и «реализует», я думаю, типизацию утки, не обязательно цепочку наследования.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню