2013-07-11 7 views
7

Lassen Sie uns einen file.js mit diesem Code haben:Wie erfordert die Arbeit mit neuen Operator in node.js?

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

Jetzt haben wir eine andere JS-Datei, wo wir folgendes:

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

In r1 Fall ist es wie vorgesehen funktioniert - R1 enthält auf die Referenz neu erstelltes Objekt

In r2 Fall funktioniert es nicht - r2 ruft Verweis auf module.exports aus der Datei.js.

Die Absicht war, ein neues Objekt durch Aufruf von func() - Konstruktor zu erstellen. Sicher, ich kann es auch auf diese Weise, die zu r1 gleich ist:

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

Aber ich verstehe nicht, warum r2 die gleiche Art und Weise wie r1 nicht verhalten.

Wie machen die zusätzlichen runden Klammern ('./ file') einen Unterschied?

Antwort

16

Diese beiden Versionen unterscheiden sich grundlegend.

Dieses:

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

Führt die erforderlich ist, um die Ausfuhr von ./file zurückkehren und dann den neuen Operator ruft auf den Ergebnissen.

Dieses:

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

Invokes erfordern als Konstrukteur.


die bei einem isolierten und einfachen Beispiel betrachten lassen:

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

Vielen Dank für eine große Erklärung. Versteh ich den neuen Operator richtig, wenn ich sage, dass der Compiler, wenn er eine Funktion auf der rechten Seite von new findet, diese als Konstruktor bezeichnet. Wenn jedoch ein Objekt vorhanden ist (der Fall r1, nach (require ('./ file')), geht es weiter und prüft, ob die Datei ('r1') eine Funktion ist und ruft sie dann als Konstruktor auf. Hab ich recht? –

+0

Ja, Sie haben Recht. –

+0

Danke für die Bestätigung. Es ist traurig, dass solche Informationen darüber, wie der Operator NEW interpretiert wird, ich nirgends finden konnte :( –

Verwandte Themen