node.js util全域性變數 事件驅動events
阿新 • • 發佈:2019-02-04
一、util全域性變數
1.util.inherits(constructor,superConstructor)
此方法是一個實現物件間原型繼承的函式。javaScript通過原型賦值來實現繼承,細節可參考雲哥JS高階視訊(原型)。
案例看 util/inherits.js
定義了一個基礎物件Base,原型方法為showName,使用Sub物件繼承與Base,可訪問showName方法。
案例:inherits.js
2.util.inspect(object,[showHidden],[depth],[colors])
此方法是一個將任意物件轉換為字串的方法,通常用於除錯和錯誤輸出,它至少接受一個引數object。
引數:object,即要轉換的物件.
showHidden 是一個可選引數,如果值為true,將會輸出更多隱藏資訊.
depth 標識最大的遞迴的層數,如果物件很複雜,你可以指定層數以控制輸出資訊的多少。預設為2層,指定為null打印出來全部
如果color為true,輸出格式將會以ANSI顏色編碼,通常用於在終端顯示更漂亮的效果。
案例:inspect.js
二、事件驅動events
events是Node.js最重要的模版,原因是Node.js本身架構就是事件式的,而它提供了唯一的介面。所以開成Node.js事件程式設計的基石。events模組不僅用於使用者程式碼與Node.js下層事件迴圈的互動。還幾乎被所有的模組依賴。
1.事件發射器
events模組只提供了一個物件。events.EventEmitter。EventEmitter的核心就是事件發射與事件監聽器功能的封裝。EventEmitter的每個事件由一個事件或若干個引數組成,事件名是一個字串,通常表達一定的語義。對於每個事件,EventEmitter支援若干個事件監聽器。當事件發射時,註冊到這個事件的事件監聽器被依次呼叫,事件引數作為回撥函式引數傳遞。
案例:events.js
常用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,則移除指定事件的所有監聽器。
2.error事件
EventEmitter定義了一個特殊的事件error,它包含錯誤的定義,我們在遇到異常的時候通常會發射error事件,當error事件被髮射時,EventEmitter規定如果沒有相應的監聽器,Node.js會把它當作異常,退出程式並列印呼叫棧,我們一般要為發射error的事件物件設定監聽器,避免遇到錯誤後整合程式崩潰,例如:
3.繼承EventEmitter
大多數時候我們不會直接使用EventEmitter,而是在物件中繼承它,包括fs,net,http 在內的。只要是支援事件相應的核心模組都是EventEmitter的子類。
為什麼這樣做呢?
1.具有某個實體功能的物件實現事件的符合語義,事件的監聽和發射應該是一個物件的發放。
2.javaScript的物件機制基於原型,支援部分多重繼承,繼承EventEmitter不會打亂物件原有的繼承關係
var util=require('util'); function Base(){ this.name='base'; this.base=2012; this.sayHello=function(){ console.log('hello '+this.name+' this year is '+this.base); }; } Base.prototype.showName=function(){ console.log(this.name); } function Sub(){ this.name='sub'; } util.inherits(Sub,Base); var objBase=new Base(); objBase.showName(); objBase.sayHello(); console.log(objBase); var objSub=new Sub(); objSub.showName(); //objSub.sayHello();//error console.log(objSub);
var util=require('util');
function Person(){
this.name='marico';
this.toString=function(){
return this.name;
}
}
var obj=new Person();
console.log(util.inspect(obj));
console.log(util.inspect(obj,true,2,true));
var events=require('events'); var emitter=new events.EventEmitter(); emitter.on('someEvent',function (args1,args2){ console.log('Listener1',args1,args2); }); emitter.on('someEvent',function(arg1,arg2){ console.log('Listener2',arg1,arg2); }); emitter.emit('someEvent','hello',999);