Модули NodeJS против классов - PullRequest
       7

Модули NodeJS против классов

19 голосов
/ 02 августа 2011

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

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

Ответы [ 3 ]

22 голосов
/ 02 августа 2011

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

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

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

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

Вы используете как модули, так и классы для инкапсуляции, но природа этой инкапсуляции другая.

2 голосов
/ 09 августа 2013

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

0 голосов
/ 02 августа 2011

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

...