Console(consoleモジュールのConsoleコンストラクタ)

前回、consoleは"Consoleクラスのグローバルインスタンス"と言っていたけど、いろいろ調べていくと、consoleは"consoleモジュールのグローバルインスタンス"のほうが正しいのかなあっておもった・・・。

前回は、"consoleモジュールのグローバルインスタンス"について扱ったが、今回は"consoleモジュールのコンストラクタConsole"について扱う。

Console | Node.js v11.10.1 Documentation

コンストラクタに引数として、出力ストリームや、入力ストリーム、エラー出力ストリームを渡すことで、ファイルにログ出力などができる。
で、前回のグローバルインスタンス、今回のConsoleコンストラクタ含めて、いろいろな呼び出し方ができることがわかった。
まず、

前回のようなグローバルインスタンスで標準出力。

$ vi console1.js
$ node console1.js
AAA
$

こうなってました。
次に、

requireでconsoleモジュールの参照を取得し、varでcustomConsoleという変数に格納し、customConsole.logで出力。

$ vi console2.js
$ node console2.js
BBB
$

変わらない。
続いて、

customConsoleが、varによる変数から、constによる定数になっている。

$ vi console3.js
$ node console3.js
CCC
$

これも変わらない。
さて、ここから、

requireでconsoleモジュールの参照が取得できるわけだが、

分割代入 - JavaScript | MDN

constの次の"{Console}"、これは『分割代入』というJavaScriptの機能で、"その名前の要素を、その名前の変数に代入する"というもの。
consoleモジュールの中にはConsoleコンストラクタの参照があり、これをconstのConsoleに格納しているのである。

ここはfsモジュールで"output.log"への書き込みストリームを作成している。
('fs'モジュールについては後日・・・。)

Consoleコンストラクタの前にnewを付けて、オブジェクトを作成。このとき、outputStreamを渡すことで、outputStreamへの書き込みになる。
あとはlogで"DDD"を出力。

$ vi console4.js
$ node console4.js
$ ls
console1.js  console2.js  console3.js  console4.js  output.log
$ cat output.log
DDD
$

このように標準出力ではなく、"output.log"に"DDD"と書き込まれている。

さて、Consoleコンストラクタは、require('console')モジュールのConsole関数であるとも言える。

なので、それにnewを付けてオブジェクト生成をし、customConsoleに格納もできる。

$ ls
console1.js  console2.js  console3.js  console4.js  console5.js  output.log
$ vi console5.js
$ node -v
v10.15.0
$ node console5.js
/home/bg1/project/cloud/github.com/Sample/nodejs/Console/Console/src/Console/console5.js:5
customConsole.log("EEE"); // customConsole.logで'output2.log'に"EEE"を出力.
              ^

TypeError: Cannot read property 'log' of undefined
    at Object.<anonymous>
(/home/bg1/project/cloud/github.com/Sample/nodejs/Console/Console/src/Console/console5.js:5:15)
    at Module._compile (internal/modules/cjs/loader.js:689:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
    at Module.load (internal/modules/cjs/loader.js:599:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
    at Function.Module._load (internal/modules/cjs/loader.js:530:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)
    at startup (internal/bootstrap/node.js:283:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:743:3)
$ ls
console1.js  console2.js  console3.js  console4.js  console5.js
output.log  output2.log
$ cat output2.log
$

ただし、これをv10.15.0でやったら、エラーが出てしまう。

$ sudo n 11.10.0
[sudo] bg1 のパスワード:
$ node -v
v11.10.0
$ ls
console1.js  console2.js  console3.js  console4.js  console5.js
output.log  output2.log
$ rm output2.log
$ ls
console1.js  console2.js  console3.js  console4.js  console5.js  output.log
$ node console5.js
$ cat output2.log
EEE
$

そこで、nでv11.10.0に切り替えて、再度実行してみたら、今度は成功した。
(v10系のバグだろうか・・・。LTSなのに・・・。)

グローバルインスタンスのconsoleもrequire('console')と参照してるものは同じなので、

こういう風にもできる。

$ node -v
v10.15.0
$ vi console6.js
$ node console6.js
$ ls
console1.js  console2.js  console3.js  console4.js  console5.js
console6.js  output.log  output2.log  output3.log
$ cat output3.log
FFF
$

これはv10.15.0でも成功する。

Consoleは関数だから、別にnewで生成しなくても、require('console')の参照から関数として呼び出せる。(結局、newはいらない。)

$ ls
console1.js  console2.js  console3.js  console4.js  console5.js
console6.js  console7.js  output.log  output2.log  output3.log
$ vi console7.js
$ node -v
v10.15.0
$ node console7.js
/home/bg1/project/cloud/github.com/Sample/nodejs/Console/Console/src/Console/console7.js:5
customConsole.log("GGG"); // customConsole.logで'output4.log'に"GGG"を出力.
              ^

TypeError: Cannot read property 'log' of undefined
    at Object.<anonymous>
(/home/bg1/project/cloud/github.com/Sample/nodejs/Console/Console/src/Console/console7.js:5:15)
    at Module._compile (internal/modules/cjs/loader.js:689:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
    at Module.load (internal/modules/cjs/loader.js:599:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
    at Function.Module._load (internal/modules/cjs/loader.js:530:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)
    at startup (internal/bootstrap/node.js:283:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:743:3)
$ ls
console1.js  console2.js  console3.js  console4.js  console5.js
console6.js  console7.js  output.log  output2.log  output3.log
output4.log
$ cat output4.log
$ rm output4.log
$ sudo n 11.10.0
[sudo] bg1 のパスワード:
$ node -v
v11.10.0
$ node console7.js
$ ls
console1.js  console2.js  console3.js  console4.js  console5.js
console6.js  console7.js  output.log  output2.log  output3.log
output4.log
$ cat output4.log
GGG
$

これも、v10.15.0で失敗するが、v11.10.0だと成功。

グローバルインスタンスからの呼び出しも、

$ ls
console1.js  console2.js  console3.js  console4.js  console5.js
console6.js  console7.js  console8.js  output.log  output2.log
output3.log  output4.log
$ vi console8.js
$ node console8.js
/home/bg1/project/cloud/github.com/Sample/nodejs/Console/Console/src/Console/console8.js:5
customConsole.log("HHH"); // customConsole.logで'output5.log'に"HHH"を出力.
              ^

TypeError: Cannot read property 'log' of undefined
    at Object.<anonymous>
(/home/bg1/project/cloud/github.com/Sample/nodejs/Console/Console/src/Console/console8.js:5:15)
    at Module._compile (internal/modules/cjs/loader.js:689:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
    at Module.load (internal/modules/cjs/loader.js:599:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
    at Function.Module._load (internal/modules/cjs/loader.js:530:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)
    at startup (internal/bootstrap/node.js:283:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:743:3)
$ ls
console1.js  console2.js  console3.js  console4.js  console5.js
console6.js  console7.js  console8.js  output.log  output2.log
output3.log  output4.log  output5.log
$ cat output5.log
$ rm output5.log
$ sudo n 11.10.0
$ node -v
v11.10.0
$ node console8.js
$ cat output5.log
HHH
$

これも、v10.15.0で失敗するが、v11.10.0だと成功。

とにかく、今回の一件で、いろんな呼び出し方があるということを知り、JavaScriptにはクラスなんて概念なんてないことを思い知らされ、バージョンによって出来たり出来なかったりなどなど、いろんなことを学んだ・・・。

Sample/nodejs/Console/Console/src/Console at master · bg1bgst333/Sample · GitHub