1. 程式人生 > >nj09---util、inherits、inspect、events、error

nj09---util、inherits、inspect、events、error

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