¿Cómo requiere trabajar con un nuevo operador en node.js?

Tengamos un archivo.js con este código:

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

Ahora tenemos otro archivo JS donde hacemos lo siguiente:

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

En el caso de r1, funciona según lo previsto: r1 contiene una referencia al objeto recién creado.

En el caso de r2 no funciona, r2 obtiene una referencia a module.exports desde dentro de file.js.

La intención era crear un nuevo objeto llamando al constructor func (). Claro, puedo hacerlo también de esta manera que es igual a r1:

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

Sin embargo, no entiendo por qué r2 no se comporta de la misma manera que r1.

¿Cómo los paréntesis adicionales alrededor de (‘./ archivo’) hacen una diferencia?

Estas dos versiones son fundamentalmente diferentes.

Éste:

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

Ejecuta el requerimiento, devuelve las exportaciones de ./file y luego llama al nuevo operador sobre los resultados .

Éste:

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

Las invocaciones requieren como constructor.


Veamos un ejemplo más aislado y simple:

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