Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

Ответ 3

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