【问题标题】:JavaScript and NodeJS: Calling method from different JS fileJavaScript 和 NodeJS:从不同的 JS 文件调用方法
【发布时间】:2014-08-04 08:55:27
【问题描述】:

我正在使用 NodeJS 将一个 js 文件包含到另一个中。下面我展示了我的两个文件。这两个类都包含两个对象的构造函数。我想从 ClassA 调用 ClassB 中的一个方法。在 ClassA 中,我需要 ClassB(如下所示),我正在尝试创建 B 类的新实例,并在其上调用 B 类的方法 get。我收到以下错误:

cB.get();
   ^
TypeError: Cannot call method 'get' of undefined
    at Object.<anonymous> (/home/---/ClassA.js:12:4)

//ClassA.js

var imported = require('./ClassB');

function ClassA() 
{
    //....
}

var cA = new ClassA();
var cB = imported.ClassB();

cB.get();

//ClassB.js

function ClassB() 
{

    var myVar = 'test';

    function _get ()
    {
        return myVar;
    };

    this.get = function ()
    {
        return _get();
    };
 }

 exports.ClassB = ClassB;

我认为问题在于我如何实例化 B 类的对象。有没有办法解决这个问题?

【问题讨论】:

    标签: javascript node.js oop methods


    【解决方案1】:

    这是我的答案

    A 类

    var ClassB = require('./ClassB');
    var cB = new ClassB("Test");
    console.log(cB.get());
    

    B 类:

    function ClassB(myVar){
      this.myvar = myVar;
    };
    ClassB.prototype.get = function(){
      return this.myvar;
    };
    module.exports = ClassB;
    

    CMD

    $ node ClassA.js 
    Test
    

    ClassBV2

    function ClassB(){
      this.myvar = "Test";
    };
    

    如果您需要 _get 保密

    function ClassB(){
      this.myvar = "Test";
    };
    ClassB.prototype.get = function(){
      return _get();
    };
    _get = function(){
      return "Other";
    }
    module.exports = ClassB;
    

    如果你尝试使用它......

    console.log(cB._get());
               ^
    TypeError: Object #<ClassB> has no method '_get'
    

    【讨论】:

    • 我需要 _get 函数是私有的并且 get 是特权的,所以在这种情况下我不能使用原型
    • 好的,已更新以满足您的需求,仅供参考,请继续使用您想要的任何方式。
    • 这种方式更干净。接受的答案
    【解决方案2】:

    你需要实例化一个构造函数

    function ClassB() 
    {
    
        var myVar = 'test';
    
        function _get ()
        {
            return myVar;
        };
    
        this.get = function ()
        {
            return _get();
        };
     }
    
     exports.ClassB = new ClassB();
    

    【讨论】:

    • 如果我这样做了,那我该如何调用A类的构造函数呢?
    • 好的,我可以这样做:var cB = imports.ClassB;看起来还不错
    • 一旦你实例化了新的 ClassB(),你应该能够使用导出的 ClassB。
    【解决方案3】:

    您在创建实例时忘记了 new 关键字。

    【讨论】:

      猜你喜欢
      • 2017-12-06
      • 1970-01-01
      • 1970-01-01
      • 2021-04-09
      • 2023-01-23
      • 1970-01-01
      • 2012-10-07
      • 2022-12-12
      • 1970-01-01
      相关资源
      最近更新 更多