[javascript] Node.js-생성자로 module.exports 사용

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());



답변

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.exportsexports같은 목적이다. 멋진 부분은 CommonJS 모듈에서 그 어떤 것도 볼 수 없다는 것입니다. 전체 시스템이 알아서 처리하므로 exports 속성이있는 모듈 객체와 다음을 가리키는 exports 변수가 있다는 것입니다. 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"


답변

제 생각에는 node.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키워드를 사용하여 instatiate해야합니다. 다른 모든 것은 동일하게 유지됩니다.


답변

이 질문은 실제로 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);
}


답변

마지막으로 Node는 Javascript에 관한 것입니다. JS는 무언가를 달성하는 여러 가지 방법을 가지고 있으며, “생성자”를 얻는 것과 동일한 것입니다 . 중요한 것은 함수를 반환하는 것 입니다.

예를 들어 웹 브라우저 환경에서 JS를 사용하여 만든 것처럼이 방법은 실제로 새 함수를 만드는 것입니다.

개인적으로 저는 Sukima가이 게시물에서 제안한대로 프로토 타입 접근법을 선호합니다 : Node.js-생성자로 module.exports 사용


답변