You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js中不使用new关键字如何在其他类中调用目标类的方法

问题分析与解决方案

现有代码的错误点

  • 类构造函数不可直接调用:ES6 规范禁止不使用new关键字直接调用类构造函数,你现有代码中const action = Main()会直接抛出运行时错误。
  • 方法名拼写错误:Main 类中定义的方法为add_hooks,你调用时写为add_hook缺少后缀s,无法匹配到对应方法。

需求实现方案

你的需求是不通过new关键字创建实例即可访问 Main 类的方法,可根据业务场景选择以下两种实现方案:

方案1:单例模式(推荐,适合需要全局共享 hooks 状态的场景)

在 Main 类内部维护唯一实例,对外暴露获取实例的静态方法,外部无需手动new即可拿到全局唯一的 Main 实例,所有模块共享同一份 hooks 存储。

改后 main.js 代码:

class Main {
  // 私有静态属性存储唯一实例
  static #instance;
  constructor(args) {
    this.hooks = [];
  }
  // 对外暴露获取实例的静态方法
  static getInstance() {
    if (!Main.#instance) {
      Main.#instance = new Main();
    }
    return Main.#instance;
  }
  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));
  }
}
module.exports = Main;

改后 Person 类代码:

const Main = require("./main.js");
class Person {
  exec() {
    // 直接获取单例,无需手动new
    const action = Main.getInstance();
    action.add_hooks("jump", console.log.bind(console, "this will log "));
    // 测试调用钩子
    action.call_hooks("jump", "测试参数");
  }
}

方案2:静态方法改造(适合不需要实例状态隔离的场景)

如果不需要多个实例状态隔离,可直接将 Main 的属性和方法全部改为静态成员,无需实例化即可直接通过类本身调用。

改后 main.js 代码:

class Main {
  // 静态存储hooks
  static hooks = [];
  static add_hooks(name, func) {
    if (!Main.hooks[name]) Main.hooks[name] = [];
    Main.hooks[name].push(func);
  }
  static call_hooks(name, ...params) {
    if (Main.hooks[name]) Main.hooks[name].forEach((func) => func(...params));
  }
}
module.exports = Main;

改后 Person 类代码:

const Main = require("./main.js");
class Person {
  exec() {
    // 直接调用类静态方法,完全不需要创建实例
    Main.add_hooks("jump", console.log.bind(console, "this will log "));
    // 测试调用钩子
    Main.call_hooks("jump", "测试参数");
  }
}

内容的提问来源于stack exchange,提问作者Kainat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 07:09:02