Node中的全域性物件和全域性變數
這個文章主要是對上一個文章的擴充
util物件
在Node環境已經安裝好的前提下,使用util
中已經定義的方法,只需要require('util')
即可;
uti是utility(功效,用途)的縮寫。這util
模組的設計主要是為了滿足Node內部API的需求。下面來介紹兩個比較重要的:
1.inherits
這個方法實現了原型鏈之間的繼承(即JavaScript的繼承)
var util = require('util');
function base(){
this.name = 'helios';
this.sayName=function(){
console.log(this .name);
}
}
base.prototype.sayHello=function(){
console.log('hello '+this.name);
};
function sub(){
this.name='shangyilong';
this.age = 21;
}
//通過util物件下面的inherits這個方法實現了sub繼承base
util.inherits(sub,base);
var a = new sub();
a.sayHello();
2.inspect(util.inspect(object[, options]))
這個方法是將任意的物件轉換為字串格式的,一般是用在除錯。
- 第一個引數是必選的,一個任意物件
- 除了第一個後面都是可選的引數,第二個引數[showHidden]
false
,當設定為true
的時候可以打印出這個物件不可列舉屬性
和標誌屬性
- 第三個引數
depth
表示打印出這個物件的多少層屬性,這個方法對待結構複雜的物件十分有效,預設的情況下是列印兩層,如果想要無限的遞迴打印出所有的屬性可以設定為null
; - 顏色colors 預設的情況下是
false
表示所有額屬性都是一種顏色,如果設定為true
的話就是按照程式碼的ANSI
打印出程式碼的 下面來看一下程式碼:
var util = require('util');
function base(){
this.name = 'helios';
this.sayName=function (){
console.log(this.name);
}
this.toString=function () {
console.log("hello");
}
}
var a = new base();
console.log(util.inspect(util, { showHidden: true, depth: null ,colors: true , customInspect:false}));
//下面這一行程式碼是等於上面的
//console.log(util.inspect(a,true,null,true,false));
- 3.在控制檯輸出
```javascript
util.log("shagnyilong");
// output 9 May 19:03:05 - shangyilong
<div class="se-preview-section-delimiter"></div>
除了以上的還能檢查是否是字串是否符合正則,都是差不多的形式可以參考官方文件,在這裡就不進行贅述:
util模組官網文件
events模組
在Node中所有的非同步I/O操作都是使用事件機制來實現的,Node中很多物件都是events.EventEmitter
的例項。例如在fs模組中開啟和讀取檔案都是分對應的事件的,Node通過events實現事件機制,該模組中有唯一的類:EventEmitter
.
EventEmitter的核心就是事件發射與事件監聽器功能的封裝.對於每個事件,EventEmitter支援若干個事件監聽器。當事件發射時,註冊到這個事件的事件監聽器被依次呼叫,事件引數作為回撥函式引數傳遞。
常用API的方法介紹:
(1)EventEmitter.on(event,listener)為指定事件註冊一個監聽器,接受一個字串event和一個回撥函式listener
(2)EventEmitter.emit(event,[arg1],[arg2]….) 發射event事件,傳遞若干可選引數到事件監聽器的引數表
(3)EventEmitter.once(event,listener) 為指定事件註冊一個單次監聽器,即監聽器最多隻會觸發一次,觸發後立刻解除該監聽器。
(4)EventEmitter.removeListener(event,listener)移除指定事件的某個監聽器,listener必須是該事件已經註冊過的監聽器。
(5)EventEmitter.removeAllListeners([event]) 移除所有事件的所有監聽器,如果指定event,則移除指定事件的所有監聽器。
下面看一個案例:
“`
除了以上的還能檢查是否是字串是否符合正則,都是差不多的形式可以參考官方文件,在這裡就不進行贅述:
[util模組官網文件](https://nodejs.org/api/util.html)
## events模組
在Node中所有的非同步I/O操作都是使用事件機制來實現的,Node中很多物件都是`events.EventEmitter`的例項。例如在fs模組中開啟和讀取檔案都是分對應的事件的,Node通過events實現事件機制,該模組中有唯一的類:`EventEmitter`.
EventEmitter的核心就是事件發射與事件監聽器功能的封裝.對於每個事件,EventEmitter支援若干個事件監聽器。當事件發射時,註冊到這個事件的事件監聽器被依次呼叫,事件引數作為回撥函式引數傳遞。
常用API的方法介紹:
(1)EventEmitter.on(event,listener)為指定事件註冊一個監聽器,接受一個字串event和一個回撥函式listener
(2)EventEmitter.emit(event,[arg1],[arg2]....) 發射event事件,傳遞若干可選引數到事件監聽器的引數表
(3)EventEmitter.once(event,listener) 為指定事件註冊一個單次監聽器,即監聽器最多隻會觸發一次,觸發後立刻解除該監聽器。
(4)EventEmitter.removeListener(event,listener)移除指定事件的某個監聽器,listener必須是該事件已經註冊過的監聽器。
(5)EventEmitter.removeAllListeners([event]) 移除所有事件的所有監聽器,如果指定event,則移除指定事件的所有監聽器。
下面看一個案例:
```javascript
var events=require('events');
var emitter=new events.EventEmitter();
emitter.on('someEvent',function(arg1,arg2){
console.log('Listener1',arg1,arg2);
});
emitter.on('someEvent',function(arg1,arg2){
console.log('Listener2',arg1,arg2);
});
//下面是給一個給someEvent綁定了多個事件
emitter.emit('someEvent','marico',1991);
<div class="se-preview-section-delimiter"></div>
關於events的繼承
大多數時候我們不會直接使用 EventEmitter,而是在物件中繼承它。包括 fs、net、 http 在內的,只要是支援事件響應的核心模組都是 EventEmitter 的子類。
為什麼要這樣做呢?原因有兩點:
首先,具有某個實體功能的物件實現事件符合語義, 事件的監聽和發射應該是一個物件的方法。
其次 JavaScript 的物件機制是基於原型的,支援 部分多重繼承,繼承 EventEmitter 不會打亂物件原有的繼承關係。
下面來看一個具體的例子:
“`
### 關於events的繼承
大多數時候我們不會直接使用 EventEmitter,而是在物件中繼承它。包括 fs、net、 http 在內的,只要是支援事件響應的核心模組都是 EventEmitter 的子類。
為什麼要這樣做呢?原因有兩點:
首先,具有某個實體功能的物件實現事件符合語義, 事件的監聽和發射應該是一個物件的方法。
其次 JavaScript 的物件機制是基於原型的,支援 部分多重繼承,繼承 EventEmitter 不會打亂物件原有的繼承關係。
下面來看一個具體的例子:
```javascript
const util = require('util');
var events=require('events');
var emitter=new events.EventEmitter();
function MyEventEmitter() {
// 初始化`events`this例項上必要的屬性
events.call(this);
}
// 繼承`EventEmitter`原型鏈上的方法
util.inherits(MyEventEmitter, events);
//例項化一個MyEventEmitter
var a = new MyEventEmitter();
//表示已經繼承成功了
a.on('amo',function(){
console.log(8);
});
這是Node的一個系列,可以在本欄目下看其他關於Node文章,會 一直更新,有問題請在下方留言