Модули CommonJS позволяют определять экспортируемые свойства двумя способами. В любом случае вы возвращаете объект / функцию. Поскольку функции являются первоклассными гражданами в JavaScript, они могут действовать так же, как объекты (технически они являются объектами). Тем не менее, ваш вопрос об использовании new
ключевых слов имеет простой ответ: да. Я проиллюстрирую ...
Модуль экспорта
Вы можете использовать exports
предоставленную переменную для присоединения к ней свойств. Когда они требуются в другом модуле, эти присваиваемые свойства становятся доступными. Или вы можете назначить объект свойству module.exports. В любом случае то, что возвращается, require()
является ссылкой на значение module.exports
.
Пример псевдокода того, как определяется модуль:
var theModule = {
exports: {}
};
(function(module, exports, require) {
// Your module code goes here
})(theModule, theModule.exports, theRequireFunction);
В приведенном выше примере module.exports
и exports
это тот же объект. Крутая часть заключается в том, что вы не видите ничего из этого в своих модулях CommonJS, поскольку вся система заботится об этом для вас. Все, что вам нужно знать, это объект модуля со свойством экспорта и переменная экспорта, которая указывает на то же самое, что и module.exports.
Требовать с конструкторами
Поскольку вы можете прикрепить функцию непосредственно к module.exports
вам, вы можете по существу вернуть функцию, и, как и любая другая функция, ею можно управлять как конструктором (это выделено курсивом, поскольку единственная разница между функцией и конструктором в JavaScript заключается в том, как вы собираетесь ее использовать. Технически нет никакой разницы.)
Итак, следующий код является отличным, и я лично его поддерживаю:
// My module
function MyObject(bar) {
this.bar = bar;
}
MyObject.prototype.foo = function foo() {
console.log(this.bar);
};
module.exports = MyObject;
// In another module:
var MyObjectOrSomeCleverName = require("./my_object.js");
var my_obj_instance = new MyObjectOrSomeCleverName("foobar");
my_obj_instance.foo(); // => "foobar"
Требовать для неконструкторов
То же самое и с функциями, не являющимися конструкторами:
// My Module
exports.someFunction = function someFunction(msg) {
console.log(msg);
}
// In another module
var MyModule = require("./my_module.js");
MyModule.someFunction("foobar"); // => "foobar"
square
в больше не существует.Square
new square()