Узел.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());
553   4  

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

    Ничего не найдено.