当前位置: 首页 > 面试题库 >

Node.js-使用module.exports作为构造函数

汝宏伯
2023-03-14
问题内容

根据Node.js手册:

如果您希望模块导出的根是一个函数(例如构造函数),或者想一次导出一个完整的对象而不是一次构建一个对象,则将其分配给module.exports而不是export

给出的示例是:

// file: square.js
module.exports = function(width) {
  return {
    area: function() {
      return width * width;
    }
  };
}

并像这样使用:

var square = require('./square.js');
var mySquare = square(2);
console.log('The area of my square is ' + mySquare.area());

我的问题:为什么示例不使用正方形作为对象?以下内容是否有效,是否会使示例更加“面向对象”?

var Square = require('./square.js');
var mySquare = new Square(2);
console.log('The area of my square is ' + mySquare.area());

问题答案:

CommonJS模块允许两种方法来定义导出的属性。无论哪种情况,您都将返回对象/功能。因为函数是JavaScript中的一等公民,所以它们可以像对象一样操作(从技术上讲,它们是对象)。就是说,您有关使用new关键字的问题有一个简单的答案:是的。我会说明…

模块出口

您可以使用exports提供的变量将属性附加到该变量。一旦在另一个模块中需要,这些分配属性将变为可用。或者,您可以将一个对象分配给module.exports属性。无论哪种情况,所返回的require()都是对的值的引用module.exports

有关如何定义模块的伪代码示例:

var theModule = {
  exports: {}
};

(function(module, exports, require) {

  // Your module code goes here

})(theModule, theModule.exports, theRequireFunction);

在上面的示例中,module.exportsexports是相同的对象。最酷的部分是,您不会在CommonJS模块中看到任何内容,因为整个系统会为您处理所有这些,您需要知道的是,有一个带有Exports属性和Exports变量的模块对象指向该对象。
module.exports也做同样的事情。

需要构造函数

因为您可以直接将函数附加到函数上module.exports,所以实际上可以返回一个函数,并且像其他任何函数一样,都可以将其作为 构造
函数进行管理(这是斜体,因为JavaScript中的函数和构造函数之间的唯一区别是您打算如何使用它。没有区别。)

因此,以下代码非常好,我个人鼓励这样做:

// My module
function MyObject(bar) {
  this.bar = bar;
}

MyObject.prototype.foo = function foo() {
  console.log(this.bar);
};

module.exports = MyObject;

// In another module:
var MyObjectOrSomeCleverName = require("./my_object.js");
var my_obj_instance = new MyObjectOrSomeCleverName("foobar");
my_obj_instance.foo(); // => "foobar"

要求非建设者

对于类似非构造函数的函数也是如此:

// My Module
exports.someFunction = function someFunction(msg) {
  console.log(msg);
}

// In another module
var MyModule = require("./my_module.js");
MyModule.someFunction("foobar"); // => "foobar"


 类似资料:
  • 我们在代码库中有一个处理程序类的层次结构,它们实现了一种责任链原则。有一个抽象父类,它由几个子类扩展,这些子类也在其构造函数中接收抽象 我们现在需要将具体子类之一的实例注入到新实现的服务类中,我们应该用XML来配置它。我们可以为抽象父类配置一个抽象bean,但这个bean似乎不被允许用作具体子bean的构造函数-arg 有什么办法可以克服这一点吗?处理程序类层次结构是遗留代码,我们现在无法修改它们

  • 我正试图用BlueJ完成一项为uni完成的任务,但我在第一个障碍上遇到了障碍。 在赋值中,我们得到了一个类,以及该类的构造函数、方法和参数的名称。我们不允许更改这些,因为赋值部分地由测试单元标记(或类似的东西)。 该类的一个构造函数如下所示 我已经(部分)完成了 我不明白的是为什么-为什么他们使用作为构造函数的参数?这样做有什么好处? (我想这样做肯定有好处(如果没有,功能就不会存在),但我不明白

  • 这是一道我无法完成的试题。 如何仅通过编辑MyClass构造函数中的代码来让下面的java代码打印false? 不允许重写equals方法,也不允许更改main方法中的任何代码。代码必须在程序不崩溃的情况下运行。 根据我的研究,在实例化类时,不能将Java对象引用设置为null。所以我正式被难倒了。

  • 问题内容: 我在Java中使用多个构造函数时遇到麻烦。 我想做的是这样的: 但是我不能,因为第二个构造函数不能调用另一个构造函数,除非它是第一行。 这种情况的常见解决方案是什么?我无法“在线”计算arg2和arg3。我以为也许可以创建一个构造助手方法来完成实际的构造,但是我不确定这是否“漂亮”…… 编辑 :由于我的某些字段是最终的,因此使用辅助方法也是有问题的,我无法使用辅助方法进行设置。 问题答

  • 问题内容: 有谁知道为什么在Java Swing中将Vector用作构造函数参数:like ,尽管Vector被标记为过时的集合。(我也知道还有其他选择,但是使用Vector更为方便)。它与线程同步有关吗? 问题答案: 虽然既不作废也不作废,但它是原始作品的遗产;后来,它“经过改装以实现该接口”。 已同步,但是正确使用此功能以有效地依赖于实现细节。而是依靠其方法提供 事前发生 关系的类的 内存一致

  • 问题内容: 在Jackson中,当您使用注释构造函数时,必须使用注释其参数。所以这个构造函数 变成这个: 我不明白为什么有必要。你能解释一下吗? 问题答案: Jackson必须知道以什么顺序将字段从JSON对象传递给构造函数。使用反射无法在Java中访问参数名称-这就是为什么您必须在注释中重复此信息的原因。