Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

177
Vistas
Uso de una función miembro para modificar el valor de un atributo de clase en javascript

Patrón y descripción del problema

Esto parece muy trivial, pero sin embargo voy a plantear porque no puedo encontrar un ejemplo simple y claro. Tenga en cuenta que si responde con una función y no declara una clase, no lo aceptaré como solución. Entiendo que JS considera que las clases funcionan...

  1. Defino una clase
 class MyClass{ constructor(input0){ this._input0 = input0; this._input1 = []; } set_input1(){ /** * in my case complex algebraic manipulation occurs inside this function * by putting it inside of a function it encapsulates that * in this the result is 123 ;) */ this._input1.push(123); }

Ahora, para inicializar realmente el objeto como se muestra aquí. En este caso, input0 se establece en 'foo'

 myobj = new MyClass('foo') myobj.set_input1() console.log(myobj._input1) //returns empty array []

EJEMPLO DE HOY

Hoy estaba construyendo un agregador de datos con nodejs y no pude hacerlo funcionar.

ProjDb.js

 class ProjDb { constructor(_rsviewProjDirArr) { this._rsviewProjDirArr = _rsviewProjDirArr; // Full file directory paths this._allFileNameArr = []; } // end constructor set_allFileNameArr() { this._rsviewProjDirArr.forEach((i) => { fs.readdir(i, (err, files) => { if (err) { throw (err); } else { files.forEach(file => { if (path.extname(file) == ".DBF") { this._allFileNameArr.push(file); } }); } }); }); } }// end classs = ProjDb module.exports = ProjDb;

SERVIDOR.js

 const XLSX = require('xlsx'); const util = require('util'); const ProjDb = require('./ProjDb.js'); let projDb = new ProjDb( ['./rsview-data/proj1', './rsview-data/proj2']); projDb.set_allFileNameArr(); console.log(projDb._allFileNameArr.length); // result =0 but should be large number

Me gusta este patrón porque la depuración es muy fácil en dispositivos pequeños y sistemas complejos. Puedo resolver el problema rápidamente. También hace que el código sea fácil de leer. Lo único que se me ocurrió es que debido a que hay un alcance que envuelve al constructor, no puedo redefinir los valores dentro de él... Hago esto todo el tiempo en cpp y python. Entonces, si puedes explicarlo desde esa perspectiva, me encantaría. No veo que ninguno de estos deba fallar.

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

en el constructor tienes this._input1 = [];

sin embargo, la consola es console.log(myobj.input1)

funciona bien si corrige el error tipográfico del nombre:

 class MyClass{ constructor(input0){ this._input0 = input0; this._input1 = []; } set_input1(){ /** * in my case complex algebraic manipulation occurs inside this function * by putting it inside of a function it encapsulates that * in this the result is 123 ;) */ this._input1.push(123); } } myobj = new MyClass('foo') myobj.set_input1() console.log(myobj._input1) // [123]
about 4 years ago · Juan Pablo Isaza Denunciar

0

Después de un poco de excavación, encontré una manera. Parece que puede actualizar la función miembro como cabría esperar. El **código en el segundo ejemplo usa la función de nodo del módulo fs fs.readdir . Después de una revisión, descubrí que los archivos son una palabra clave para la devolución de llamada y deben usarse, además, devuelve un objeto, no una matriz. Por lo tanto, ese objeto debe transformarse en una matriz de cadenas utilizando el miembro integrado toString().

aquí está la copia de trabajo

 set_allFileNameArr() { // rename i as dirpath for (let i=0;i<this._rsviewProjDirArr.length;i++) { let _dirPath = this._rsviewProjDirArr[i]; var logstream = fs.createWriteStream('allFileNameArr.txt', {flas: 'a'}); console.log('Loading Data From Target Directory:\n\t'+_dirPath) // Method 1 // (err,files) are 2 arguments for a callbqack function fs.readdir(_dirPath, (err, _files)=>{ if (err) throw (err); else { // For loop style for (let i=0;i<_files.length;i++){ if(path.extname(_files[i])==='.DBF'){ this._allFileNameArr.push(_files[i].toString()); logstream.write(_files[i].toString()+'\n') } } } } );
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda