Tengo la siguiente estructura en el archivo a.js
function factory() { class A { constructor() { } add(num) { return num + 1; } } return A; }Me gustaría cambiar el comportamiento del método "agregar". El método "agregar" se vería a continuación. Suma de 2 en lugar de 1.
add(num) { return num + 2; }He creado un nuevo nombre de archivo como b.js
const a = import("a.js"); (new factory()).prototype.add = function(num) { return num + 2; }Pero no cambia el comportamiento del método add dentro de la función "fábrica" (archivo a.js). Me gustaría cambiar el comportamiento del método "agregar" de la función "fábrica" (a.js). ¿Podría brindarme ayuda u orientación?
Cada llamada a la función de factory creará y devolverá una nueva clase.
Por lo tanto, agregar el método add en el prototipo de una clase devuelta por la llamada particular a la función de factory no tendrá ningún efecto en las clases devueltas por otras llamadas a la función de factory .
La siguiente demostración muestra cómo puede lograr el resultado deseado.
function factory() { class A { add(num) { return num + 1; } } return A; } const MyClass = factory(); MyClass.prototype.add = function (num) { return num + 2; }; const b = new MyClass(); console.log(b.add(1)); Si vuelve a llamar a la función de factory , devolverá una nueva clase que tendrá el método de add que agrega solo 1.
La siguiente demostración muestra esto en acción:
function factory() { class A { add(num) { return num + 1; } } return A; } const MyClassA = factory(); const MyClassB = factory(); // Overwrite "add" method in MyClassA MyClassA.prototype.add = function (num) { return num + 2; }; console.log(new MyClassA().add(1)); // 3 console.log(new MyClassB().add(1)); // 2 (MyClassB uses the defaul "add" method) Por lo tanto, deberá agregar el método add en el prototipo cada vez que se llame a la función factory .
Una forma de evitar sobrescribir el método add cada vez que llama a la función de factory es crear otra función, que:
factoryaddadd actualizado Con este enfoque, el código que sobrescribe el método add es reutilizable.
El siguiente código muestra un ejemplo:
function factory() { class A { add(num) { return num + 1; } } return A; } function factoryWrapper() { const MyClass = factory(); MyClass.prototype.add = function(num) { return num + 2; }; return MyClass; } const Class1 = factoryWrapper(); const Class2 = factoryWrapper(); console.log(new Class1().add(1)); console.log(new Class2().add(1));