โมดูล CommonJS อนุญาตให้กำหนดคุณสมบัติที่ส่งออกได้สองวิธี ไม่ว่าในกรณีใดคุณกำลังส่งคืน Object / Function เนื่องจากฟังก์ชันเป็นพลเมืองชั้นหนึ่งใน 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
เป็นวัตถุเดียวกัน ส่วนที่น่าสนใจคือคุณไม่เห็นสิ่งนั้นในโมดูล CommonJS ของคุณเนื่องจากทั้งระบบดูแลสิ่งนั้นให้คุณสิ่งที่คุณต้องรู้คือมีวัตถุโมดูลที่มีคุณสมบัติการส่งออกและตัวแปรการส่งออกที่ชี้ไปที่ สิ่งเดียวกับที่ 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"
ข้อกำหนดสำหรับผู้ที่ไม่ได้สร้าง
สิ่งเดียวกันสำหรับ non-constructor เช่นฟังก์ชัน:
// My Module
exports.someFunction = function someFunction(msg) {
console.log(msg);
}
// In another module
var MyModule = require("./my_module.js");
MyModule.someFunction("foobar"); // => "foobar"
square
เพื่ออยู่ไม่ได้Square
new square()