Узел.js-использование модуля.экспорт как конструктор
согласно узлу.Яш руководство:
Если вы хотите, чтобы корень экспорта вашего модуля был функцией (например
конструктор), или если вы хотите экспортировать весь объект в одном
назначение вместо того, чтобы строить его по одному свойству за раз, назначьте его
модуль.экспорт, а не экспорт.
данный пример:
// 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());
4 ответов:
CommonJS модули позволяют двумя способами определить экспортируемые свойства. В любом случае вы возвращаете объект/функцию. Поскольку функции являются гражданами первого класса в JavaScript, они могут действовать так же, как объекты (технически они являются объектами). Что сказал, Ваш вопрос об использовании
newключевые слова имеет простой ответ: да. Я проиллюстрирую...экспорт модуль
можно использовать
exportsпеременная, предоставленная для присоединения к ней свойств. Как только требуется в другом модуле эти свойства присваиваются становятся доступными. Или вы можете назначить объект модулю.экспортирует имущество. В любом случае, что возвращаетсяrequire()ссылка на значениеmodule.exports.псевдо-код пример того, как определен модуль:
var theModule = { exports: {} }; (function(module, exports, require) { // Your module code goes here })(theModule, theModule.exports, theRequireFunction);в приведенном выше примере
module.exportsиexportsэто один и тот же объект. Самое интересное, что вы не видите ничего из этого в своих модулях CommonJS, так как вся система заботится об этом для вас всех нужно знать, есть ли объект модуля со свойством exports и переменной 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"
по-моему, какой-то узел.примеры js довольно надуманны.
вы могли бы ожидать увидеть что-нибудь подобное в реальном мире
// square.js function Square(width) { if (!(this instanceof Square)) { return new Square(width); } this.width = width; }; Square.prototype.area = function area() { return Math.pow(this.width, 2); }; module.exports = Square;использование
var Square = require("./square"); // you can use `new` keyword var s = new Square(5); s.area(); // 25 // or you can skip it! var s2 = Square(10); s2.area(); // 100
для людей ES6
class Square { constructor(width) { this.width = width; } area() { return Math.pow(this.width, 2); } } export default Square;используя его в ES6
import Square from "./square"; // ...при использовании класса, вы должны использовать
newключевое слово для его установки. Все остальное остается прежним.
этот вопрос не имеет ничего общего с тем, как
require()строительство. В принципе, все, что вы установитеmodule.exportsв ваш модуль будет возвращен изrequire()вызовите его.это было бы эквивалентно:
var square = function(width) { return { area: function() { return width * width; } }; }нет необходимости в
newключевое слово при вызовеsquare. Вы не возвращаете сам экземпляр функции изsquare, вы возвращаете новый объект в конце. Поэтому вы можете просто вызвать эту функцию непосредственно.для более сложных аргументов вокруг
new, проверьте это: считается ли "новое" ключевое слово JavaScript вредным?
пример кода:
в основном
square(width,function (data) { console.log(data.squareVal); });используя следующие произведения
exports.square = function(width,callback) { var aa = new Object(); callback(aa.squareVal = width * width); }
Comments