Tengo un módulo de javascript que se parece a esto:
var TestModule = function(param) { this.display = function() { console.log(`testModule.display called, with parameter: ${param}`); } } module.exports = TestModule;También tengo un programa que usa este módulo, así:
var TestModule = require('./test-module.js'); var testModule = new TestModule('asdf'); testModule.display();Cuando ejecuto el programa, obtengo el siguiente resultado:
testModule.display called, with parameter: asdfTodo esto parece estar bien hasta ahora y hacer lo que quiero: hacer que el valor que envío esté disponible para las funciones dentro del módulo.
Sin embargo, también he visto lo siguiente hecho en el código del módulo:
var TestModule = function(param) { this.param = param; this.display = function() { console.log(`testModule.display called, with parameter: ${this.param}`); } } module.exports = TestModule;Ejecutar esta segunda versión me da el mismo resultado que la primera.
Mi pregunta es, ¿cuál es el propósito de this.param = param ? ¿Qué hace eso por mí que mi versión original no hace?
La principal diferencia es que el objeto devuelto por el constructor tiene la propiedad adjunta a su prototipo.
En la segunda versión, console.log(testModule.param) da "asdf" y la primera versión da esta propiedad como undefined .
Si adjunta funciones al prototipo, que es el enfoque normal porque solo define cada función una vez, los cierres de estas funciones no verán el param si no se ha adjuntado a this como lo hace la segunda versión.
El module.exports no tiene nada que ver con esto, por cierto.
this.param = param Almacenará el argumento en el objeto en sí, permitiéndole hacer testModule.param y acceder a él (como cuando hace testModule.display() para acceder al método de display )
Además, debe usar la sintaxis de clase ES6 para modernizar su código