Các mô-đun CommonJS cho phép hai cách để xác định các thuộc tính đã xuất. Trong cả hai trường hợp, bạn đang trả về một Đối tượng / Hàm. Vì các hàm là công dân hạng nhất trong JavaScript nên chúng có thể hoạt động giống như Đối tượng (về mặt kỹ thuật chúng là Đối tượng). Điều đó cho thấy câu hỏi của bạn về việc sử dụng các new
từ khóa có một câu trả lời đơn giản: Có. Tôi sẽ minh họa ...
Xuất mô-đun
Bạn có thể sử dụng exports
biến được cung cấp để đính kèm thuộc tính vào nó. Sau khi được yêu cầu trong một mô-đun khác, các thuộc tính gán đó sẽ có sẵn. Hoặc bạn có thể gán một đối tượng cho thuộc tính module.exports. Trong cả hai trường hợp, những gì được trả về require()
là một tham chiếu đến giá trị của module.exports
.
Ví dụ về mã giả về cách mô-đun được xác định:
var theModule = {
exports: {}
};
(function(module, exports, require) {
// Your module code goes here
})(theModule, theModule.exports, theRequireFunction);
Trong ví dụ trên module.exports
và exports
là cùng một đối tượng. Phần thú vị là bạn không thấy bất kỳ điều gì trong số đó trong các mô-đun CommonJS của mình vì toàn bộ hệ thống sẽ chăm sóc điều đó cho bạn, tất cả những gì bạn cần biết là có một đối tượng mô-đun có thuộc tính xuất khẩu và biến xuất khẩu trỏ đến điều tương tự mà module.exports làm.
Yêu cầu với các hàm tạo
Vì bạn có thể đính kèm một hàm trực tiếp vào, module.exports
về cơ bản bạn có thể trả về một hàm và giống như bất kỳ hàm nào, nó có thể được quản lý như một hàm tạo (Chữ in nghiêng vì sự khác biệt duy nhất giữa hàm và một hàm tạo trong JavaScript là cách bạn dự định sử dụng nó. Về mặt kỹ thuật không có sự khác biệt.)
Vì vậy, đoạn mã sau đây là hoàn toàn tốt và cá nhân tôi khuyến khích nó:
// 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"
Yêu cầu đối với các trình không xây dựng
Điều tương tự cũng xảy ra đối với các hàm không phải hàm tạo như:
// 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
cácnew square()
không còn tồn tại.