2013-07-11 6 views
7

Diamo uno file.js con questo codice:In che modo è necessario lavorare con un nuovo operatore in node.js?

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

Ora abbiamo un altro file JS in cui facciamo seguire:

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

In caso r1 funziona come previsto - r1 contiene riferimento alla oggetto appena creato.

Nel caso r2 non funziona - r2 ottiene riferimento a module.exports dall'interno del file.js.

L'intenzione era creare un nuovo oggetto chiamando func() costruttore. Certo, posso farlo anche in questo modo che è pari a r1:

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

Comunque, io non capisco perché r2 non si comporta allo stesso modo di r1.

In che modo la parentesi aggiuntiva richiesta ('./ file') fa la differenza?

risposta

16

Queste due versioni sono fondamentalmente diverse.

Questa:

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

esegue le richiedono, restituendo le esportazioni di ./file e quindi chiamando l'operatore new sui risultati.

Questa:

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

Richiama richiedono come costruttore.


Diamo un'occhiata a un esempio più isolata e semplice:

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

Grazie per una grande spiegazione. Capisco correttamente il nuovo operatore se dico che quando il compilatore trova una funzione sul lato destro di new, lo chiama come costruttore. Tuttavia, se c'è un oggetto (il caso r1, dopo la valutazione (require ('./ file')), va avanti e controlla se il file ('r1') è una funzione e poi la invoca come costruttore. Ho ragione? –

+0

Sì, sei corretto. –

+0

Grazie per la conferma. È triste che tali informazioni su come interpretare il NUOVO operatore non sono state in grado di trovare da nessuna parte :( –

Problemi correlati