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
相关产品推荐
相关产品推荐

