调用 class 的方法而不在其他 class 节点 js 中使用 NEW 关键字

call a methods of a class without using NEW keyword inside other class node js

我想在不创建新实例的情况下将 Main class 方法访问给另一个 Person class 可能吗? 我们可以在不创建 class

实例的情况下访问它吗?

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));
      }
    }

other class 不使用 new 关键字如何访问的人

const Main = require("./main.js");
class Person {
  exec() {
    const action =  Main();
    action.add_hook("jump", console.log.bind(console, "this will log "));
  }
}

如果您不打算实例化对象,并且不关心拥有多个实例且每个实例都有自己的状态,则不需要 class。

只需创建单个函数,或导出一个对象。

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);
  }
}

也可以用静态方法来做到这一点,如果你写 Java 一切 是 class,但我不会在 Javascript 中推荐它。

它没有什么大魔法。由于 OP 只想重用原型 Main 方法,因此将显式委托 method/s 感兴趣的 was/were provided/accessed 之前通过 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; }