Модули NodeJS vs классы


Для меня классы очень похожи на модули NodeJS (CommonJS). Вы можете иметь много из них, они могут быть использованы повторно, они могут использовать друг друга, и они, как правило, по одному файлу.

Чем модули так отличаются от классов? Способ их использования отличается, и разница в пространстве имен очевидна. Кроме того, они кажутся мне очень похожими или, возможно, я просто не вижу здесь очевидной выгоды.

3 19

3 ответа:

Модули больше похожи на пакеты (если использовать термин Java), чем на классы. Вы не создаете экземпляр модуля; существует только одна его копия. Это инструмент для организации связанных функций, но обычно он не инкапсулирует данные конкретного экземпляра объекта.

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

function Car() {
    this.colour = 'red';
}
Car.prototype.getColour = function() { return this.colour; };

var myCar = new Car();
myCar.getColour(); // returns 'red'

Для инкапсуляции используются как модули, так и классы, но природа этой инкапсуляции различна.

JS изначально была прототипной системой наследования. Это было очень просто, как и весь остальной язык. Но затем Netscape решила сделать его более похожим на Java и добавила в язык идею конструкторов. Отсюда и родились псевдоклассы. Вы можете проверить эту ссылку, чтобы узнать, как прототипный ООП используется в JS: http://howtonode.org/prototypical-inheritance

Одна критическая вещь; что" обычно один на файл " вещь не верна; модули абсолютно один на файл. require(), который вводит Модуль exports в пространство имен, не имеет возможности различать экспортируемое содержимое этого модуля; все, что модуль (файл) экспортирует, импортируется с помощью оператора require(). Попытка поместить более одного модуля в файл означает только то, что вы получите все, что в этом файле, когда вы попытаетесь загрузить "любой" модуль.