Честно, я не разбирал исходники и не вникал как работает require(). Джеймс называет их модулями. По большому счету в итоге мы все равно получаем объект.
Это может быть что угодно: объект, функция, просто переменная или скажем хеш констант. Тем более, что функция от конструктора в JS отличается не декларацией, а тем, как вы её потом используете.
>> Тем более, что функция от конструктора в JS отличается не декларацией, а тем, как вы её потом используете.
Функция от конструктора отличается контекстом, а стало быть и декларацией.
Буквально на выходных решил разобраться с node.js, для чего склепал чат, в котором, как в гугловейве, каждое сообщение передается по мере печати.
С модулями особо не парился, делал ссылку на класс доступной через exports. В яваскрипте жутко взбесило отсутствие связывания методов со своими объектами. В частности, что хендлеры для EventEmitter выполняются в его контексте, а не в контексте объекта, к которому хендлер принадлежит. После долгого использования AS3 очень сложно смириться с тем, что в js принято городить кучу вложенных анонимных функций и передавать контекст через замыкание.
Понимание require() в Node.js