2013-07-11 9 views
7

Rzućmy file.js z tego kodu:W jaki sposób wymaga pracy z nowym operatorem w pliku node.js?

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

Teraz mamy kolejny plik JS gdzie mamy następujący:

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

W przypadku gdy R1 to działa zgodnie z przeznaczeniem - R1 zawiera odniesienie do nowo utworzony obiekt.

W przypadku r2 to nie działa - r2 uzyskuje odwołanie do module.exports z pliku file.js.

Celem było utworzenie nowego obiektu przez wywołanie konstruktora func(). Jasne, że może to zrobić również w ten sposób, która jest równa R1:

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

Ja jednak nie rozumiem dlaczego r2 nie zachowuje się tak samo jak R1.

W jaki sposób dodatkowy nawias wokół wymagać ("./ plik") ma znaczenie?

Odpowiedz

16

Te dwie wersje są zasadniczo różne.

ten jeden:

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

Wykonuje zażądać zwrotu eksportu ./file a następnie wywołanie nowego operatora na wynikach.

ten jeden:

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

wywołuje wymagają jako konstruktor.


Spójrzmy na bardziej izolowane i prosty przykład:

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

Dzięki za wspaniałe wyjaśnienie. Czy poprawnie rozumiem nowego operatora, jeśli powiem, że gdy kompilator znajdzie funkcję po prawej stronie, wywołuje ją jako konstruktor. Jednakże, jeśli istnieje obiekt (ocena r1, po (wymagają ("./ plik")) oceny, to idzie dalej i sprawdza, czy plik ("r1") jest funkcją, a następnie wywołuje go jako konstruktora. Mam rację? –

+0

Tak, masz rację. –

+0

Dzięki za potwierdzenie. To smutne, że takie informacje o tym, jak interpretowany jest NOWY operator, nie znalazłem nigdzie indziej :( –

Powiązane problemy