Quiero acceder a los métodos de la clase Principal a otra clase de Persona sin crear una nueva instancia. ¿Es posible? ¿Podemos acceder a él sin crear una instancia de una clase?
let myInstance = new Person();
class Main { constructor(args) { this.hooks = []; } add_hooks(name, func) { if (!this.hooks[name]) this.hooks[name] = []; this.hooks[name].push(func); } call_hooks(name, ...params) { if (this.hooks[name]) this.hooks[name].forEach((func) => func(...params)); } }otra clase Persona cómo acceder sin usar una nueva palabra clave
const Main = require("./main.js"); class Person { exec() { const action = Main(); action.add_hook("jump", console.log.bind(console, "this will log ")); } }Si no planea instanciar el objeto y no le importa tener varias instancias, cada una con su propio estado, no necesita una clase.
Simplemente cree funciones individuales o exporte un objeto.
const hooks = []; export function add_hooks(name, func) { if (!hooks[name]) hooks[name] = []; hooks[name].push(func); } export function call_hooks(name, ...params) { if (!hooks[name]) return; for (const func of this.hooks[name]) { func(...params); } }También es posible hacer esto con métodos estáticos, y esa sería la respuesta probable si escribe Java donde todo tiene que ser una clase, pero no lo recomendaría en Javascript.
No hay gran magia en ello. Dado que el OP solo quiere reutilizar los métodos Main prototípicos, uno va a delegar explícitamente los métodos de interés que se proporcionaron/a los que se accedió antes a través Main.prototype ...
class Main { constructor(args) { this.hooks = {}; } add_hooks(name, func) { if (!this.hooks[name]) { this.hooks[name] = []; } this.hooks[name].push(func); } call_hooks(name, ...params) { if (this.hooks[name]) { this.hooks[name].forEach(func => func(...params)); } } } // const Main = require("./main.js"); class Person { // // ... either add `hooks` as public property at instantiation time ... // hooks = {}; exec() { const ref = Main.prototype; ref.add_hooks.call(this, "jump", console.log.bind(console, "this will log")); } } // ... or add `hooks` via additional glue code ... function createPersonWithHooksAndExecute() { const type = new Person(); type.hooks = {}; type.exec(); return type; } const someone = createPersonWithHooksAndExecute(); console.log({ someone }); // this will log Main.prototype.call_hooks.call(someone, "jump"); .as-console-wrapper { min-height: 100%!important; top: 0; }