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.exports
와 exports
같은 목적이다. 멋진 부분은 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 사용