nj09---util、inherits、inspect、events、error
阿新 • • 發佈:2017-06-15
cti rip 機制 move 遞歸 整合 多少 指定 ava
一、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 可參考:http://nodejs.org/api/Utilities.html 二、事件驅動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,則移除指定事件的所有監聽器。 可參考:http://nodejs.org/api/events.html 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(){ var ee = "ee";//var聲明的變量不會被對象訪問 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); } Base.prototype.abc="abc"; function Sub(){ this.name=‘sub‘; } util.inherits(Sub,Base);//只能繼承原型的 var objBase=new Base(); objBase.showName();//base objBase.sayHello();//hello base this year is 2012 console.log(objBase);//Base{name:‘base‘,base:2012,sayHello:[Function]},不打印原型的東西 var objSub=new Sub(); objSub.showName();//sub //objSub.sayHello(); console.log(objSub.abc);//abc console.log(objSub);//Sub{name:‘sub‘},不打印原型的東西
var util=require(‘util‘); function Person(){ this.name=‘marico‘; this.toString=function(){ return this.name; } } var obj=new Person(); console.log(util.inspect(obj));//Person { name: ‘marico‘, toString: [Function] } console.log(util.inspect(obj,true,2,true));/* Person { name: ‘marico‘, toString: { [Function] [length]: 0, [name]: ‘‘, [arguments]: null, [caller]: null, [prototype]: { [constructor]: [Circular] } } } */
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); }); emitter.emit(‘someEvent‘,‘marico‘,1991);//Listener1 marico 1991 //Listener2 marico 1991
var events=require(‘events‘); var emitter=new events.EventEmitter(); emitter.emit(‘error‘);
nj09---util、inherits、inspect、events、error