【问题标题】:How to to export both the class and superclass in Node.js using module.exports and require()?如何使用 module.exports 和 require() 在 Node.js 中导出类和超类?
【发布时间】:2018-04-22 04:34:28
【问题描述】:

这可能很明显,但我不明白如何使用module.export 来导出子类和超类。我目前收到错误ReferenceError: not defined。这是/js/dalmatian.js 中的示例子类Dalmatian

class Dalmatian extends Dog{
  constructor(){
       super();
      /// stuff
  }
}

module.exports = {
  Dalmatian : Dalmatian
}

如果我将这个类导出到另一个 *.js 文件中,我会遇到问题:

require('../js/dog.js');   // this works
require('../js/dalmatian.js');   // this fails

ReferenceError: Dog is not defined

我不明白。超级构造函数在 Dalmatian 中使用,即super();

如何导出基类(这里是Dog),这样我就不会收到这个错误?

【问题讨论】:

  • 在使用之前,您需要从 Dalmation 的模块中导入 Dog 基类。导出后,模块无法看到彼此的方法/类
  • @AbidHasan 对不起,我不关注。你能用代码更具体吗?我还是 Node.js 的初学者

标签: javascript node.js module


【解决方案1】:

您必须在子类声明中require 父类。还有export父表单子类export子句。

然后,您可以在 requires('./dalmatian') 子类的脚本中同时使用 DogDalmatian

这是一个工作示例:

dog.js

class Dog{
    constructor(){
      console.log('dog');
  }
}

module.exports = Dog;

dalmatian.js(请注意我们如何导出两者)

const Dog = require('./dog');

class Dalmatian extends Dog{
    constructor(){
        super();
      console.log('dalmatian');
  }
}

module.exports = {
  Dalmatian : Dalmatian, //export this class
  Dog: Dog // and export parent class too!
}

test.js

const Dalmatian = require('./dalmatian').Dalmatian;
const Dog = require('./dalmatian').Dog; //---> Notice this
//const Dog = require('./dog'); ---> works too, but above is clearer and cleaner

new Dalmatian();
new Dog();

输出:

➔ node test.js
dog
dalmatian
dog

【讨论】:

  • 您能解释一下为什么const Dog = require('./dog'); 存在于dalmatian.js 中吗?目前,我使用的 Node.js 应用程序似乎没有这个。
  • 如果你在 Dalmatian 中引用 Dog(你可以说 class Dalmatian extends Dog),那么你需要定义 Dog。这就是为什么你必须导入它
  • @ShanZhengYang 是正确的。那是因为。要求按顺序执行。第一个是 dalmatian.js,它使用“Dog”。所以现在 node 在你使用它之前需要知道这一点。所以你只需要在使用它之前在“dalmatian.js”中要求它。有意义吗?
  • @Shaunak 这是有道理的;我现在明白为什么会出现错误。我认为您的意思是在上述评论中引用 Abid Hasan。
  • 我确实做到了:)
【解决方案2】:

Dog 没有在包含Dalmation 的模块中定义,因为模块无法访问彼此的变量。

您的 Dalmation 模块应如下所示:

var parentClass = require('./Dog.js')

class Dalmatian extends parentClass.Dog {
    constructor(){
      super();
      console.log('starting dalmation')
    }
}

module.exports = {
  Dalmatian: Dalmatian
}

另外,请注意 super() 应该在构造方法中调用 ,而不是在它之前。

【讨论】:

  • “另外,注意 super() 应该在构造方法中调用,而不是在它之前。”。抱歉,这是上面的错字。谢谢
猜你喜欢
  • 2021-05-19
  • 2020-06-13
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多