Согласно руководству по Node.js:
Если вы хотите, чтобы корнем экспорта вашего модуля была функция (например, конструктор), или если вы хотите экспортировать полный объект в одном назначении, а не строить его по одному свойству за раз, назначьте его для module.exports вместо экспорта ,
Приведенный пример:
// file: square.js
module.exports = function(width) {
return {
area: function() {
return width * width;
}
};
}
и используется так:
var square = require('./square.js');
var mySquare = square(2);
console.log('The area of my square is ' + mySquare.area());
Мой вопрос: почему в примере не используется квадрат в качестве объекта? Верно ли следующее и делает ли пример более «объектно-ориентированным»?
var Square = require('./square.js');
var mySquare = new Square(2);
console.log('The area of my square is ' + mySquare.area());
javascript
node.js
commonjs
Naresh
источник
источник
square
в больше не существует.Square
new square()
Ответы:
Модули CommonJS позволяют определять экспортируемые свойства двумя способами. В любом случае вы возвращаете объект / функцию. Поскольку функции являются первоклассными гражданами в JavaScript, они могут действовать так же, как объекты (технически они являются объектами). Тем не менее, ваш вопрос об использовании
new
ключевых слов имеет простой ответ: да. Я проиллюстрирую ...Модуль экспорта
Вы можете использовать
exports
предоставленную переменную для присоединения к ней свойств. Когда они требуются в другом модуле, эти присваиваемые свойства становятся доступными. Или вы можете назначить объект свойству module.exports. В любом случае то, что возвращается,require()
является ссылкой на значениеmodule.exports
.Пример псевдокода того, как определяется модуль:
В приведенном выше примере
module.exports
иexports
это тот же объект. Крутая часть заключается в том, что вы не видите ничего из этого в своих модулях CommonJS, поскольку вся система заботится об этом для вас. Все, что вам нужно знать, это объект модуля со свойством экспорта и переменная экспорта, которая указывает на то же самое, что и module.exports.Требовать с конструкторами
Поскольку вы можете прикрепить функцию непосредственно к
module.exports
вам, вы можете по существу вернуть функцию, и, как и любая другая функция, ею можно управлять как конструктором (это выделено курсивом, поскольку единственная разница между функцией и конструктором в JavaScript заключается в том, как вы собираетесь ее использовать. Технически нет никакой разницы.)Итак, следующий код является отличным, и я лично его поддерживаю:
Требовать для неконструкторов
То же самое и с функциями, не являющимися конструкторами:
источник
На мой взгляд, некоторые примеры node.js довольно надуманы.
Возможно, вы ожидаете увидеть нечто подобное в реальном мире.
использование
Для людей ES6
Использование в ES6
При использовании класса вы должны использовать
new
ключевое слово для его инсталляции. Все остальное остается прежним.источник
new
и неиспользованием . Но это только потому, что у вас есть чекthis instanceof square
? Если да, то что именно делает этот механизм?import
иexport
определены? Это зарезервированные ключевые слова в ECMAScript 6 (ES6). До ES6 для управления модулями приходилось использовать библиотеки. Модулирование узла моделируется по образцу модулей библиотеки CommonJS. Чтоdefault
внутриexport default Square
? Это указывает, что нужно импортировать, когда вы просто импортируете «файл», а не другие, определенные операции экспорта из этого файла. Для тех пор , пока они существуют, я нашел эти страницы полезные: spring.io/understanding/javascript-modules и exploringjs.com/es6/ch_modules.htmlЭтот вопрос на самом деле не имеет ничего общего с тем, как
require()
работает. По сути, все, что вы установилиmodule.exports
в своем модуле, будет возвращено для этогоrequire()
вызова.Это было бы эквивалентно:
new
При звонке ключевое слово не требуетсяsquare
. Вы не возвращаете сам экземпляр функции,square
в конце вы возвращаете новый объект. Следовательно, вы можете просто вызвать эту функцию напрямую.Чтобы
new
найти более сложные аргументы , проверьте это: считается ли ключевое слово JavaScript "new" вредоносным?источник
new
чтобы другие могли участвовать в войне там.Пример кода:
в основном
использование следующих может работать
источник
В конце концов, Node посвящен Javascript. JS имеет несколько способов сделать что-то, то же самое, чтобы получить «конструктор», важно вернуть функцию. .
Таким образом, вы фактически создаете новую функцию, как мы, например, создали с помощью JS в среде веб-браузера.
Лично я предпочитаю прототипный подход, как предложил Сукима в этом посте: Node.js - использование module.exports в качестве конструктора
источник