Node.js自定義對象事件的監聽與發射

一、Node.js是以事件驅動的,那我們自定義的一些js對象就需要能監聽事件以及發射事件。

在Node.js中事件使用一個EventEmitter對象發出,該對象在events模塊中。它應該是使用觀察者設計模式來實現把事件監聽器添加到對象以及移除,之前寫OC那塊的時候也有些觀察者設計模式,在OC中也經常用到:通知中心、KVO,也很容易理解.

  • .addListener(eventName,callback):將回調函數附加到對象的監聽器中。當eventName的事件被觸發時,回調函數被放置在事件隊列中執行。
  • .on(eventName,callback):和.addListener一樣。
  • .once(eventName,callback),也是監聽不過隻在第一次被觸發。
  • .listeners(eventName):返回一個連接到eventName事件的監聽器函數數組。
  • .setMaxListeners(n):如果多於n的監聽器加入到EventRmitter對象,就會出發警報.
  • .removeListener(eventName,callback):將callback函數從EventEmitter對象的eventName事件中移除。

二、上面寫瞭那麼多也都是EventEmitter對象方法的使用,自定義的對象怎麼能使用它們才是關鍵!

監聽方法都是在EventEmitter對象,要想讓自定義的對象也能使用這些方法,那就需要繼承EventEmitter。

js中實現繼承有好幾種方法:構造函數、原型鏈、call、apply等,可以百度一下:js繼承。關於原型對象原型鏈這個寫的挺不錯:三張圖帶你搞懂JavaScript的原型對象與原型鏈

隻需將Events.EventEmitter.prototype添加到對象原型中.(在EventEmitter中是通過prototype來添加的監聽器方法)

三、使用

var events = require('events');
function Account() {
    this.balance = 0;
    //買的資料書上寫要添加下面的語句,我將下面語句註釋掉也能實現繼承,應該是不需要的吧
    //events.EventEmitter.call(this);
    this.deposit = function(amount){
        this.balance += amount;
        this.emit('balanceChanged');
    };
    this.withdraw = function(amount){
        this.balance -= amount;
        this.emit('balanceChanged');
    };
}
Account.prototype.__proto__ = events.EventEmitter.prototype;
function displayBalance(){
    console.log("Account balance: $%d", this.balance);
}
function checkOverdraw(){
    if (this.balance < 0){
        console.log("Account overdrawn!!!");
    }
}
function checkGoal(acc, goal){
    if (acc.balance > goal){
        console.log("Goal Achieved!!!");
    }
}
var account = new Account();
account.on("balanceChanged", displayBalance);
account.on("balanceChanged", checkOverdraw);
account.on("balanceChanged", function(){
    checkGoal(this, 1000);
});
account.deposit(220);
account.deposit(320);
account.deposit(600);
account.withdraw(1200);

輸出結果:

Account balance: $220
Account balance: $540
Account balance: $1140
Goal Achieved!!!
Account balance: $-60
Account overdrawn!!!

Process finished with exit code 0

到此這篇關於Node.js自定義對象事件的文章就介紹到這瞭。希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。

推薦閱讀: