creé el módulo txtModule usando el patrón de módulo revelador con jquery,
Quiero imprimir el valor de una etiqueta de entrada en una consola... para ese método de prueba expuesto como público, como se muestra a continuación.
var txtModule = (function(window,$){ var txt = { topics:{}, test:function(){ console.log(this.input.val()); }, _init:function(){ this._cacheDom(); }, _cacheDom:function(){ this.input = $("input#c_input"); }, } txt._init(); return { test : txt.test, } }); var v = txtModule(window,$); v.test(); cuando ejecuta el método público de prueba cuando intenta acceder a this.input variable de entrada, aparece un error como se muestra a continuación
Uncaught TypeError: Cannot read properties of undefined (reading 'val') Quiero saber cómo puedo exponer correctamente el método de prueba al exterior para acceder a this.input
Llamar txt._init() llena el objeto txt con una propiedad de input , pero luego, cuando lo hace
v.test(); más tarde, puede ver que el lado izquierdo del archivo . es v - que es el objeto devuelto al final
return { test : txt.test, } y no el objeto txt . Cuando hace v.test() , this que ve la función de test es el objeto que solo tiene la propiedad de test .
Depende de si desea que la entrada sea visible externamente o no; de lo contrario, consulte txt ; de lo contrario, cree una variable para el objeto devuelto y consúltelo.
var txtModule = (function(window,$){ var txt = { topics:{}, test:function(){ console.log(this.input.val()); }, _init:function(){ this._cacheDom(); }, _cacheDom:function(){ returnedObj.input = $("input#c_input"); }, } const returnedObj = { test : txt.test, }; txt._init(); return returnedObj; }); var v = txtModule(window,$); v.test();Pero esto es algo complicado: tener dos objetos diferentes que recopilan pares clave-valor algo similares hace que las cosas sean confusas. Considere si usar solo uno en su lugar ayudaría, por ejemplo:
const txtModule = (function (window, $) { const input = $("input#c_input"); const test = () => { console.log(input.val()); }; return { test }; }); const v = txtModule(window, $); v.test();