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

183
Vistas
¿De qué manera puedo pasar una llamada de método en la clase de JavaScript?

Supongamos que tenemos algunas clases A y B:

 Class A { constructor(a) { this.a = a; }; showInfo() { console.log(this.a) }; }; Class B { constructor(b) { this.b = b; }; printText() { console.log('its B!'); }; };

Luego creamos una instancia de B como esta:

 const objB = new B( new A(3) );
  1. Así que ahora tenemos objB con su propio método dentro - printText, y seguramente podemos llamarlo. Pero, ¿qué pasa si quiero de alguna manera cuando llamo a un método no existente en objB para que pase a la clase A encapsulada allí y busco invocar este método en él, así: objB.showInfo() - para darme 3 aquí?

  2. La misma historia, pero en este momento quiero que, al llamar a un método no existente en A, pase a B afuera (como ese printText )?

PD No quiero usar super() y herencia, solo composición y envolver objetos, espero que haya entendido.

about 4 years ago · Santiago Gelvez
1 Respuestas
Responde la pregunta

0

Solo una pequeña advertencia al principio: esto puede hacer que su programa sea más difícil de depurar, y también puede ser un poco complicado para algo como esto. Como han sugerido otros, probablemente debería investigar otras opciones que pueden ser más simples y también menos en el camino de todo lo demás que hace su código.

Aquí está el código que proporciona la funcionalidad:

 function makeGetProxy(t){ return new Proxy(t, { get(obj,prop){ if(prop in t){ return t[prop]; }else{ var keys = Object.keys(obj); for (var i = 0; i < keys.length; i++) { var val = t[keys[i]]; if(prop in val){ return val[prop]; // what about a recursive function? } } return undefined; } } }); }

Y un pequeño cambio en tu constructor en B :

 class B { constructor(b) { this.b = b; return makeGetProxy(this); }; printText() { console.log('its B!'); }; };

Si quieres, también puedes hacer lo mismo con A

Reduzcamos la velocidad. ¿Lo que acaba de suceder? Lo explicaré.

  1. Dado que las propiedades que podríamos solicitar aún no existen, vamos a tener que usar un getter (ver recursos) para devolver correctamente el valor requerido. Pero, dado que no conocemos los nombres de las propiedades, necesitamos un Proxy (ver recursos) para tener un tipo de método get "catch-all".

  2. El proxy verificará si la propiedad prop ya existe y, de ser así, la devolverá. Si no existe, verifica todas las propiedades de sus propiedades (todas las subpropiedades).

  3. El primer resultado que obtiene, lo devuelve. Esto podría causar errores inesperados en su programa. Si no lo encuentra, simplemente devuelve undefined .

  4. Luego, el proxy se generaliza en una función para su reutilización en múltiples clases (como lo solicitó).

Entonces, esto puede obtener las propiedades de una clase y las propiedades de las propiedades de una clase, pero si necesita ir más allá (con su clase C que aún no existe), puede usar una función recursiva. Actualmente no tengo la implementación para esa función recursiva, pero en mi cabeza comprendería principalmente una versión modificada del bloque else en la función makeGetProxy .

Nuevamente, tenga cuidado con este código. Podría interponerse en el camino de otras cosas y causar dificultades innecesarias en la depuración.

Recursos:

  • Captadores (MDN)
  • Proxy (MDN)
  • Tomé prestado un código de esta respuesta y obtuve la idea de Proxy de esta respuesta .
about 4 years ago · Santiago Gelvez 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