Node.jsの勉強（２）util

Node.jsの勉強2回目はutilについてです。

# util.deprecate

ある関数が使われるべきではなくなったことを示します。最初の引数として関数を渡し、2つ目の引数としてメッセージを渡します。返り値として最初の引数として渡した関数を包含した関数が得られます。得られた関数を呼び出した場合には、1回目の呼び出しの際にのみ警告が出力されます。

```js
> let deprecatedFunc = util.deprecate(function() {
... console.log("logged");
... }, "deprecated function was called");
undefined
> deprecatedFunc()
deprecated function was called
logged
undefined
> deprecatedFunc()
logged
undefined
```

# util.inherits

継承を行います。最初の引数として子コンストラクタを渡し、2つ目の引数として親コンストラクタを渡します。この関数を使って継承を行うと、子コンストラクタの`super_`プロパティとして子コンストラクタから親コンストラクタを参照できるプロパティが追加されます。

以前JavaScriptで継承を実現する方法について記事を書きましたが、

* [Javascriptで継承](http://qiita.com/pizyumi/items/15261272eaa4a1ad2f51)
* [Javascriptで継承（補足）](http://qiita.com/pizyumi/items/83a3a3a43c9d1a3ca2f0)

この記事の例（`Currency`コンストラクタと`CryptoCurency`コンストラクタ）を`util.inherits`を使って書き直すと次のようになります。

```js
> function Currency(name, code) {
... this.name = name;
... this.code = code;
... }
undefined
> Currency.prototype.toString = function() {
... return this.name + " " + this.code;
... }
[Function]
> function CryptoCurrency(name, code, author) {
... Currency.call(this, name, code);
...
... this.author = author;
... }
undefined
> util.inherits(CryptoCurrency, Currency)
undefined
> CryptoCurrency.prototype.toString = function() {
... return CryptoCurrency.super_.prototype.toString.call(this) + " " + this.author;
... }
[Function]
```

# util.log

引数として受け取った0個以上の文字列を日時付きで標準出力に出力し、改行を行います。日時付きであるという点以外は前回の記事で取り上げた[`console.log`](http://qiita.com/pizyumi/items/c367825c2cef95115ed6#consolelog)と同じです。

```js
> util.log()
15 Nov 11:44:31 -
undefined
> util.log("a")
15 Nov 11:44:38 - a
undefined
> util.log("a", "b")
15 Nov 11:44:44 - a b
undefined
> util.log("%d yen kudasai")
15 Nov 11:44:57 - %d yen kudasai
undefined
> util.log("%d yen kudasai", 50000)
15 Nov 11:45:11 - 50000 yen kudasai
undefined
```

# util.format

書式指定文字列を使って文字列を作成します。文字列を返すという点以外は前回の記事で取り上げた[`console.log`](http://qiita.com/pizyumi/items/c367825c2cef95115ed6#consolelog)と同じです（`console.log`は`util.format`を内部で使用しています）。

```js
> util.format()
''
> util.format("a")
'a'
> util.format("a", "b")
'a b'
> util.format("%d yen kudasai")
'%d yen kudasai'
> util.format("%d yen kudasai", 50000)
'50000 yen kudasai'
> util.format("%d yen kudasai", 50000, "masenka")
'50000 yen kudasai masenka'
> util.format("mama", "%d yen kudasai", 100)
'mama %d yen kudasai 100'
> util.format("%d yen kudasai", "100")
'100 yen kudasai'
> util.format("%d yen kudasai", "a")
'NaN yen kudasai'
```

# util.inspect

最初の引数として受け取ったオブジェクトの内容を表す文字列を作成します。2つ目の引数としてオプションを渡すことができます。

`depth`で再帰の深さを指定します。`null`を指定した場合、無制限に再帰します。`colors`を`true`に指定すると、文字を出力した場合に色を付けるためのANSIエスケープコードを付加します。

```js
> util.inspect()
'undefined'
> util.inspect(123)
'123'
> util.inspect("ppp")
'\'ppp\''
> util.inspect({})
'{}'
> util.inspect({a: "a"})
'{ a: \'a\' }'
> util.inspect({a: "a", b: "b", c: {d: {e: {f: {}}}}})
'{ a: \'a\', b: \'b\', c: { d: { e: [Object] } } }'
> util.inspect({a: "a", b: "b", c: {d: {e: {f: {}}}}}, {depth: 3})
'{ a: \'a\', b: \'b\', c: { d: { e: { f: {} } } } }'
> util.inspect({a: "a", b: "b", c: {d: {e: {f: {}}}}}, {depth: null})
'{ a: \'a\', b: \'b\', c: { d: { e: { f: {} } } } }'
> util.inspect({a: "a", b: "b", c: {d: {e: {f: {}}}}}, {depth: null, colors: true})
'{ a: \u001b[32m\'a\'\u001b[39m, b: \u001b[32m\'b\'\u001b[39m, c: { d: { e: { f: {} } } } }'
```

`showHidden`を`true`に指定すると、列挙可能でないプロパティも出力対象となります。

```js
> let obj = {}
undefined
> Object.defineProperty(obj, 'foo', {enumerable: false})
{}
> obj
{}
> util.inspect(obj, {showHidden: true})
'{ [foo]: undefined }'
```

オブジェクトにinspect関数が定義されている場合（プロトタイプに定義されている場合も含む）には、文字列を作成するために、組み込みの処理の代わりにオブジェクトのinspect関数が呼び出されます。

inspect関数には最初の引数として`util.inspect`のオプションの一部として渡された`depth`がそのまま渡されます（オプションとして`depth`を指定しなかった場合には既定値である`2`が渡されます）。

```js
> function Person(name) {
... this.name = name;
... }
undefined
> Person.prototype.inspect = function(depth) {
... return "I'm " + this.name + "." + "depth: " + depth;
... }
[Function]
> let yumina = new Person("yumina")
undefined
> util.inspect(yumina)
'I\'m yumina.depth: 2'
> util.inspect(yumina, {depth: 5})
'I\'m yumina.depth: 5'
```

inspect関数が返す値は文字列でなければならない訳ではありません。任意のオブジェクトを返すことができます。

```js
> Person.prototype.inspect = function(depth) {
... return {name: this.name, depth: depth};
... }
[Function]
> util.inspect(yumina)
'{ name: \'yumina\', depth: 2 }'
> util.inspect(yumina, {depth: 5})
'{ name: \'yumina\', depth: 5 }'
```

更に、色の設定は`util.inspect.styles`と`util.inspect.colors`で変更できます。

```js
> util.inspect.styles
{ special: 'cyan',
  number: 'yellow',
  boolean: 'yellow',
  undefined: 'grey',
  null: 'bold',
  string: 'green',
  symbol: 'green',
  date: 'magenta',
  regexp: 'red' }
> util.inspect.colors
{ bold: [ 1, 22 ],
  italic: [ 3, 23 ],
  underline: [ 4, 24 ],
  inverse: [ 7, 27 ],
  white: [ 37, 39 ],
  grey: [ 90, 39 ],
  black: [ 30, 39 ],
  blue: [ 34, 39 ],
  cyan: [ 36, 39 ],
  green: [ 32, 39 ],
  magenta: [ 35, 39 ],
  red: [ 31, 39 ],
  yellow: [ 33, 39 ] }
```

`util.inspect.styles`でそれぞれの種類の値を何色にするか設定し、`util.inspect.colors`で色のコードを設定します。それぞれの色のコードは1つ目のコードが色を付けるためのコードで2つ目のコードが元に戻すためのコードです。