转自:http://www.runoob.com/nodejs/nodejs-module-system.html
util是一个Node.js核心模块,提供常用函数的集合,用于弥补JavaScript的功能的不足,util模块设计的主要目的是为了满足Node内部API的需求。其中包括:格式化字符串、对象的序列化、实现对象继承等常用方法。要使用util模块中的方法,只需require('util')
引入即可。
- 格式化输出字符串:util.format(format[, ...])
- 在控制台标准输出:util.log(string)
- 将对象序列化为字符串:util.inspect(object[, options])
- 自定义
util.inspect
颜色 - 自定义对象的
inspect()
方法
- 自定义
- 检查对象是否是数组:util.isArray(object)
- 检查对象是否是
RegExp
类型:util.isRegExp(object) - 检查对象是否是
Date
类型:util.isDate(object) - 检查对象是否是
Error
类型:util.isError(object) - 实现对象间原型继承:util.inherits(constructor, superConstructor)
1. 格式化输出字符串:util.format(format[, ...])
根据第一个参数,返回一个格式化字符串,类似printf
的格式化输出。 传入的第一个参数是一个字符串,其中包含零个或多个占位符,format
方法会将其中的每一个占位符被替换为与其对应的值后,输出结果。 format
方法支持的占位符有:
%s
- 字符串.%d
- 数字 (整型和浮点型).%j
- JSON. 如果这个参数包含循环对象的引用,将会被替换成字符串'[Circular]'
。%%
- 单独一个百分号('%'
)。不会占用一个参数。
format
方法的几种使用示例:
console.log(util.format('%s:%s', 'foo')); // foo:%s console.log(util.format('%s:%s:%d', 'foo', 'bar', 'baz')); // foo:bar:NaN console.log(util.format(1, 2, 3)); // 1 2 3
2. 在控制台标准输出:util.log(string)
printf
方法用于在控制台stdout
输出,输出带有时间戳。
util.log('这是一个stout输出'); //15 Jun 18:28:20 - 这是一个stout输出
3. 将对象序列化为字符串:util.inspect(object[, options])
inspect
方法用于将对象序列化为字符串,这一方法在调试代码查看对象结构时非常有用。其可选参数可选值如下:
-
showHidden
- 是否枚举显示对象的隐藏属性。默认为false
depth
- 设置对象枚举显示的深度。默认为2
,设置为null
时将无穷递归显示colors
- 如果设为true
,将会以ANSI颜色代码风格进行输出。默认为false
customInspect
- 如果设为false
,那么定义在被检查对象上的inspect(depth, opts) 方法将不会被调用。 默认为true
。
例如检查util
对象的所有属性。代码如下:
var util = require('util'); console.log(util.inspect(util, { showHidden: true, depth: null }));
3.1 自定义 util.inspect
颜色
util.inspect
属性用于自定义输出的颜色和样式,可以通过util.inspect.styles
和util.inspect.colors
属性设置。
util.inspect.colors
可定义的颜色有:white
, grey
, black
, blue
, cyan
, green
, magenta
, red
和 yellow
。
util.inspect.styles
可定义的样式有:bold
, italic
, underline
和 inverse
3.2 自定义对象的 inspect()
方法
对象可以定义自己的 inspect(depth)
方法;当使用util.inspect()
检查该对象的时,自定义的inspect(depth)
方法将会被执行。使用示例如下:
var util = require('util'); var obj = { name: 'nate' }; obj.inspect = function(depth) { return '{' + this.name + '}'; }; util.inspect(obj); // "{nate}"
4. 检查对象是否是数组:util.isArray(object)
isArray()
方法用于检查传入对象是否是数据,isArray()
方法会首先使用ECMAScript5中的Array.isArray()
方法和typeof
操作符等进行检查,以确保检查结果的正确性。几种使用示例如下:
var util = require('util'); util.isArray([]) // true util.isArray(new Array) // true util.isArray({}) // false
5. 检查对象是否是RegExp
类型:util.isRegExp(object)
isRegExp
方法用于检查对象是否是RegExp
类型,即是否为正则表达式对象。几种使用示例如下:
var util = require('util'); util.isRegExp(/some regexp/) // true util.isRegExp(new RegExp('another regexp')) // true util.isRegExp({}) // false
6. 检查对象是否是Date
类型:util.isDate(object)
isDate
方法用于检查对象是否是RegExp
类型,即日期类型。几种使用示例如下:
var util = require('util'); util.isDate(new Date()) // true util.isDate(Date()) // false (without 'new' returns a String) util.isDate({}) // false
7. 检查对象是否是Error
类型: util.isError(object)
isError
方法用于检查对象是否是Error
类型。几种使用示例如下:
var util = require('util'); util.isError(new Error()) // true util.isError(new TypeError()) // true util.isError({ name: 'Error', message: 'an error occurred' }) // false
8. 实现对象间原型继承:util.inherits(constructor, superConstructor)
util.inherits(constructor, superConstructor)
是一个实现对象间原型继承的方法。JavaScript 的面向对象特性是基于原型的继承,与常见的基于类的不同,JavaScript 没有提供对象继承的语言级别特性,而是通过原型链复制来实现的。inherits
方法可以将父类原型链上的方法复制到子类中,实现原型式继承。
使用示例,实现一型式继承:
var util = require("util"); var events = require("events"); //MyStream构造函数,在构造函数将this指向本对象 function MyStream() { events.EventEmitter.call(this); } //复制父对象上所有的方法 util.inherits(MyStream, events.EventEmitter); //对MyStream类添加原型方法 MyStream.prototype.write = function(data) { this.emit("data", data); } var stream = new MyStream(); //由于MyStream继承自EventEmitter,所以其实例stream是MyStream类的实例也是EventEmitter类的实例 console.log(stream instanceof events.EventEmitter); // true console.log(MyStream.super_ === events.EventEmitter); // true //父类中的方法调用 stream.on("data", function(data) { console.log('Received data: "' + data + '"'); }) //子类中的方法调用 stream.write("It works!"); // Received data: "It works!"
util
模块中还有一些方法如:util.debug(string)
、util.puts([...])
、util.pump(readableStream, writableStream, [callback])
等,但都不是稳定版本或已被其它方法替代,不再赘述。