1. 程式人生 > >Node中的全域性物件和全域性變數

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文章,會 一直更新,有問題請在下方留言