首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Node中的其他文件调用类实例的函数

从Node中的其他文件调用类实例的函数
EN

Stack Overflow用户
提问于 2017-09-26 14:16:12
回答 3查看 9.3K关注 0票数 1

我有一个bot.js类,在其中我创建了函数getUserInventory。我在我的主文件bot.js中需要app.js,并创建了一个新实例。

bot.js

代码语言:javascript
复制
class SteamBot {

    constructor(logOnOptions){

        [...]
        this.logOn(logOnOptions);

    }

    logOn(logOnOptions){

        [...]

    }

    getUserInventory(sid, gameid, contextid, onlyTradeable, callback){
        [...]
    }

}

module.exports = SteamBot;

app.js

代码语言:javascript
复制
const SteamBot = require('./bots/bot.js');

const bot = new SteamBot({
    'logOnOptions'
});

现在,只需键入getUserInventory,就可以在app.js文件中调用bot.getUserInventory(...)函数。

但是,如果我想在另一个文件中调用函数呢?我是否必须键入与我在app.js中编写的代码相同的代码?或者这会引起问题吗?

我是个初学者。

EN

回答 3

Stack Overflow用户

发布于 2017-09-26 14:32:54

当您调用new SteamBot();时,您正在创建一个SteamBot的新实例,这取决于您打算如何使用您的SteamBot,您需要多个蒸汽还是只需要一个?如果您只需要应用程序中的一个实例,我建议您这样做:

文件/steambot.class.js

代码语言:javascript
复制
// this file contains your class
class SteamBot {

    ...
}

module.exports = SteamBot; 

文件/steambot.js

代码语言:javascript
复制
const SteamBotClass = require('./steambot.class');
let SteamBot;

module.exports = function(...args) {
    SteamBot = SteamBot || new SteamBotClass(...args);
    return SteamBot;
};

/app.js

代码语言:javascript
复制
const SteamBot = require('./steambot')({
    'logOnOptions'
});

如果您想在第三个文件中使用相同的实例:

代码语言:javascript
复制
const SteamBot = require('./steambot')();

有了这个结构,在您的应用程序中,如果有一天您需要创建一个新的类,只需使用.class.js文件,那么就可以创建一个新的类,但是如果您需要在整个应用程序中保留一个SteamBot实例,只需使用steambot.js即可。

它给出了一个基于文件的单例模式,与我也喜欢的Grégory的答案有点不同。

希望这会有所帮助:)

票数 4
EN

Stack Overflow用户

发布于 2017-09-26 14:26:42

您在app.js中所做的是实例化class SteamBot的一个新的object

然后调用该对象的方法getUserInventory

你能从另一个文件中调用这个对象的方法吗?

是的,如果您将刚才创建的对象传递给该文件。如果不是,您必须实例化一个新对象,这可能是一个错误,因为我将与您创建的第一个对象完全不同(类的另一个实现将具有它自己的属性)。

要通过对象实例化,您可以做两件事:

  • 使用静态方法。静态方法不需要实例化。

示例:

SteamBot.getUserInventory(...)

代码语言:javascript
复制
class SteamBot {

   static getUserInventory(...)  {
     ...
   }

}
  • 使用单例模式,只允许创建类的一个实例。

示例:

代码语言:javascript
复制
let instance = null;

class SteamBot {

 constructor() {
   if (instance) return instance;

   instance = this;

   return instance;
 }

 static getInstance() {
   return instance || new SteamBot();
 }

}
票数 0
EN

Stack Overflow用户

发布于 2017-09-26 14:22:41

你怎么命名你的机器人变量并不重要。如果您将其命名为bot,您将调用bot.getUserInventory(...),如果anotherBot,则调用anotherBot.getUserInventory(...),如果是foo,则调用foo.getUserInventory(...)等等。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46428892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档