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());
공통 JS 모듈을 사용하면 내보낸 속성을 두 가지 방법으로 정의할 수 있습니다.두 경우 모두 개체/함수를 반환합니다.함수는 JavaScript에서 일등 시민이므로 Objects(기술적으로 Objects)처럼 동작할 수 있습니다.그것은 사용에 대한 당신의 질문을 말해주었습니다.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동일한 개체입니다.멋진 부분은 당신이 당신의 공통점에서 그것들 중 어떤 것도 보지 못한다는 것이 없다는 것입니다.JS 모듈은 전체 시스템이 이를 처리하므로 내보내기 속성을 가진 모듈 개체와 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키워드를 지정합니다.다른 모든 것은 그대로입니다.
이 질문은 사실 어떻게 하는 것과 아무런 관련이 없습니다.require()효과가 있어요 기본적으로, 당신이 설정한 것이 무엇이든module.exports에서 로 됩니다.require()그것을 요구합니다.
이는 다음과 같습니다.
var square = function(width) {
return {
area: function() {
return width * width;
}
};
}
다음이 필요하지 않습니다.new시키드워▁▁calling워를 부를 때의 키워드▁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 사용
언급URL : https://stackoverflow.com/questions/20534702/node-js-use-of-module-exports-as-a-constructor
'programing' 카테고리의 다른 글
| MySQL에서 지정된 텍스트가 포함된 필드를 쿼리하려면 어떻게 해야 합니까? (0) | 2023.07.28 |
|---|---|
| 주요 가치 관찰을 수행하고 UIView 프레임에서 KBO 콜백을 받으려면 어떻게 해야 합니까? (0) | 2023.07.28 |
| 배열 목록을 방지합니다.인덱스 반환에서 추가() (0) | 2023.07.28 |
| 잘못된 iPhone 응용 프로그램 이진 (0) | 2023.07.28 |
| UILabel - 문자열을 텍스트 및 링크로 사용 (0) | 2023.07.28 |