Node.js自定義對(duì)象事件的監(jiān)聽與發(fā)射
一、Node.js是以事件驅(qū)動(dòng)的,那我們自定義的一些js對(duì)象就需要能監(jiān)聽事件以及發(fā)射事件。
在Node.js中事件使用一個(gè)EventEmitter對(duì)象發(fā)出,該對(duì)象在events模塊中。它應(yīng)該是使用觀察者設(shè)計(jì)模式來實(shí)現(xiàn)把事件監(jiān)聽器添加到對(duì)象以及移除,之前寫OC那塊的時(shí)候也有些觀察者設(shè)計(jì)模式,在OC中也經(jīng)常用到:通知中心、KVO,也很容易理解.
- .addListener(eventName,callback):將回調(diào)函數(shù)附加到對(duì)象的監(jiān)聽器中。當(dāng)eventName的事件被觸發(fā)時(shí),回調(diào)函數(shù)被放置在事件隊(duì)列中執(zhí)行。
- .on(eventName,callback):和.addListener一樣。
- .once(eventName,callback),也是監(jiān)聽不過只在第一次被觸發(fā)。
- .listeners(eventName):返回一個(gè)連接到eventName事件的監(jiān)聽器函數(shù)數(shù)組。
- .setMaxListeners(n):如果多于n的監(jiān)聽器加入到EventRmitter對(duì)象,就會(huì)出發(fā)警報(bào).
- .removeListener(eventName,callback):將callback函數(shù)從EventEmitter對(duì)象的eventName事件中移除。
二、上面寫了那么多也都是EventEmitter對(duì)象方法的使用,自定義的對(duì)象怎么能使用它們才是關(guān)鍵!
監(jiān)聽方法都是在EventEmitter對(duì)象,要想讓自定義的對(duì)象也能使用這些方法,那就需要繼承EventEmitter。
js中實(shí)現(xiàn)繼承有好幾種方法:構(gòu)造函數(shù)、原型鏈、call、apply等,可以百度一下:js繼承。關(guān)于原型對(duì)象原型鏈這個(gè)寫的挺不錯(cuò):三張圖帶你搞懂JavaScript的原型對(duì)象與原型鏈
只需將Events.EventEmitter.prototype添加到對(duì)象原型中.(在EventEmitter中是通過prototype來添加的監(jiān)聽器方法)
三、使用
var events = require('events');
function Account() {
this.balance = 0;
//買的資料書上寫要添加下面的語句,我將下面語句注釋掉也能實(shí)現(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自定義對(duì)象事件的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
npm?ERR!Cannot?read?properties?of?null(reading?'p
這篇文章主要給大家介紹了關(guān)于npm?ERR!Cannot?read?properties?of?null(reading?'pickAlgorithm')報(bào)錯(cuò)問題的解決方法,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-03-03
Node.js實(shí)現(xiàn)數(shù)據(jù)推送
這篇文章主要為大家詳細(xì)介紹了Node.js實(shí)現(xiàn)數(shù)據(jù)推送的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-04-04
垃圾回收器的相關(guān)知識(shí)點(diǎn)總結(jié)
本文是小編在網(wǎng)絡(luò)上整理的關(guān)于垃圾回收器的相關(guān)知識(shí)點(diǎn),很多語言和程序都用的到,有興趣的可以學(xué)習(xí)下。2018-05-05
Nodejs監(jiān)控事件循環(huán)異常示例詳解
這篇文章主要給大家介紹了關(guān)于Nodejs監(jiān)控事件循環(huán)異常的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Nodejs具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09

