2013-07-11 34 views
7

Hãy có một file.js với mã này:Làm cách nào yêu cầu làm việc với toán tử mới trong node.js?

module.exports.func = function(txt) { 
    this.a = 1; 
    this.b = 2; 
    console.log(txt, this); 
    return this; 
} 

Bây giờ chúng tôi có một tập tin JS mà chúng tôi sau đây:

var r1 = new (require('./file')).func('r1'); 
var r2 = new require('./file').func('r2'); 

Trong trường hợp r1 nó hoạt động như mong đợi - r1 chứa tham chiếu đến đối tượng mới được tạo.

Trong trường hợp r2 nó không hoạt động - r2 được tham chiếu đến module.exports từ bên trong tệp.js.

Mục đích là tạo đối tượng mới bằng cách gọi hàm tạo func(). Chắc chắn, tôi cũng có thể thực hiện theo cách này bằng r1:

var r3 = require('./file'); 
var r4 = new r3.func('r1'); 

Tuy nhiên, tôi không hiểu tại sao r2 không hoạt động giống như r1.

Dấu ngoặc đơn phụ xung quanh yêu cầu ('./ file') tạo sự khác biệt như thế nào?

Trả lời

16

Hai phiên bản này về cơ bản là khác nhau.

này một:

new (require('./file')).func('r1'); 

Thực thi các yêu cầu, trả lại kim ngạch xuất khẩu của ./file và sau đó gọi các nhà điều hành mới về kết quả.

này một:

var r2 = new require('./file').func('r2'); 

gọi đòi hỏi như một constructor.


Hãy xem xét một ví dụ bị cô lập hơn và đơn giản:

new Date() // creates a new date object 
new (Date()) // throws a TypeError: string is not a function 
+1

Cám ơn một lời giải thích tuyệt vời. Tôi có hiểu toán tử mới một cách chính xác nếu tôi nói rằng khi trình biên dịch tìm thấy một hàm ở bên phải của mới, nó gọi nó là một hàm tạo. Tuy nhiên, nếu có một đối tượng (trường hợp r1, sau (require ('./ file')) đánh giá), nó tiếp tục và kiểm tra xem tệp ('r1') có phải là một hàm hay không và gọi nó là một hàm tạo. Tôi có đúng không? –

+0

Có, bạn là chính xác. –

+0

Cảm ơn bạn đã xác nhận. Thật đáng buồn là những thông tin như vậy về cách toán tử MỚI đang được giải thích, tôi không thể tìm thấy ở đâu: ( –

Các vấn đề liên quan