Node.js自定義對象事件的監(jiān)聽與發(fā)射
一、Node.js是以事件驅(qū)動的,那我們自定義的一些js對象就需要能監(jiān)聽事件以及發(fā)射事件。
在Node.js中事件使用一個EventEmitter對象發(fā)出,該對象在events模塊中。它應(yīng)該是使用觀察者設(shè)計模式來實現(xiàn)把事件監(jiān)聽器添加到對象以及移除,之前寫OC那塊的時候也有些觀察者設(shè)計模式,在OC中也經(jīng)常用到:通知中心、KVO,也很容易理解.
- .addListener(eventName,callback):將回調(diào)函數(shù)附加到對象的監(jiān)聽器中。當(dāng)eventName的事件被觸發(fā)時,回調(diào)函數(shù)被放置在事件隊列中執(zhí)行。
- .on(eventName,callback):和.addListener一樣。
- .once(eventName,callback),也是監(jiān)聽不過只在第一次被觸發(fā)。
- .listeners(eventName):返回一個連接到eventName事件的監(jiān)聽器函數(shù)數(shù)組。
- .setMaxListeners(n):如果多于n的監(jiān)聽器加入到EventRmitter對象,就會出發(fā)警報.
- .removeListener(eventName,callback):將callback函數(shù)從EventEmitter對象的eventName事件中移除。
二、上面寫了那么多也都是EventEmitter對象方法的使用,自定義的對象怎么能使用它們才是關(guān)鍵!
監(jiān)聽方法都是在EventEmitter對象,要想讓自定義的對象也能使用這些方法,那就需要繼承EventEmitter。
js中實現(xiàn)繼承有好幾種方法:構(gòu)造函數(shù)、原型鏈、call、apply等,可以百度一下:js繼承。關(guān)于原型對象原型鏈這個寫的挺不錯:三張圖帶你搞懂JavaScript的原型對象與原型鏈
只需將Events.EventEmitter.prototype添加到對象原型中.(在EventEmitter中是通過prototype來添加的監(jiān)聽器方法)
三、使用
var events = require('events'); function Account() { this.balance = 0; //買的資料書上寫要添加下面的語句,我將下面語句注釋掉也能實現(xiàn)繼承,應(yīng)該是不需要的吧 //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);
輸出結(jié)果:
Account balance: $220
Account balance: $540
Account balance: $1140
Goal Achieved!!!
Account balance: $-60
Account overdrawn!!!Process finished with exit code 0
到此這篇關(guān)于Node.js自定義對象事件的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
詳解阿里Node.js技術(shù)文檔之process模塊學(xué)習(xí)指南
這篇文章主要介紹了詳解阿里Node.js技術(shù)文檔之process模塊學(xué)習(xí)指南,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01Windows 系統(tǒng)下安裝和部署Egret的開發(fā)環(huán)境
Egret基于TypeScript開發(fā)的,而TypeScript編譯工具tsc是基于Node.js 開發(fā)的。所以在安裝過程中,我們先需要對于基礎(chǔ)支持工具進行安裝。2014-07-07nodejs入門教程三:調(diào)用內(nèi)部和外部方法示例
這篇文章主要介紹了nodejs入門教程之調(diào)用內(nèi)部和外部方法,結(jié)合實例形式分析了nodejs內(nèi)部與外部方法的定義與調(diào)用相關(guān)操作實現(xiàn)技巧,需要的朋友可以參考下2017-04-04手把手教你使用TypeScript開發(fā)Node.js應(yīng)用
為了減少代碼編寫過程中出現(xiàn)的錯誤,以及更好的維護你的項目,本文將手把手教你配置一個簡單的開發(fā)環(huán)境來編寫Node.js的應(yīng)用程序,感興趣的小伙伴們可以參考一下2019-05-05使用Nodejs?實現(xiàn)一個簡單的?Redis客戶端(推薦)
在nodejs中支持TCP連接的是net模塊,?其中使用createConnection(config)或者直接new?Socket(config)來初始化一個TCP連接,這篇文章主要介紹了用Nodejs?實現(xiàn)一個簡單的?Redis客戶端,需要的朋友可以參考下2022-11-11