1. ホーム
  2. javascript

[解決済み] Node.js - module.exports をコンストラクタとして使用する。

2022-07-26 23:01:10

質問

Node.jsのマニュアルによると。

モジュールのエクスポートのルートを関数にしたい場合(例えば コンストラクタのような)関数にしたい場合、または一度に完全なオブジェクトをエクスポートしたい場合は 一度に1つのプロパティを構築する代わりに、1つの割り当てで完全なオブジェクトをエクスポートしたい場合、それを モジュールに割り当てます。

与えられた例では

// 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モジュールでは、エクスポートされたプロパティを定義するために2つの方法があります。どちらの場合でも、オブジェクト/関数を返すことになります。関数は 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モジュールでそのようなものを見ないということです。

コンストラクタで要求する

に直接関数をアタッチすることができるので 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"