Node.jsの勉強2回目はutilについてです。
util.deprecate
ある関数が使われるべきではなくなったことを示します。最初の引数として関数を渡し、2つ目の引数としてメッセージを渡します。返り値として最初の引数として渡した関数を包含した関数が得られます。得られた関数を呼び出した場合には、1回目の呼び出しの際にのみ警告が出力されます。
> 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で継承を実現する方法について記事を書きましたが、
この記事の例(Currency
コンストラクタとCryptoCurency
コンストラクタ)をutil.inherits
を使って書き直すと次のようになります。
> 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
と同じです。
> 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
と同じです(console.log
はutil.format
を内部で使用しています)。
> 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エスケープコードを付加します。
> 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
に指定すると、列挙可能でないプロパティも出力対象となります。
> 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
が渡されます)。
> 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関数が返す値は文字列でなければならない訳ではありません。任意のオブジェクトを返すことができます。
> 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
で変更できます。
> 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つ目のコードが元に戻すためのコードです。