溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Node.js如何自定義對(duì)象事件的監(jiān)聽與發(fā)射

發(fā)布時(shí)間:2022-07-06 10:29:31 來源:億速云 閱讀:139 作者:iii 欄目:開發(fā)技術(shù)

本文小編為大家詳細(xì)介紹“Node.js如何自定義對(duì)象事件的監(jiān)聽與發(fā)射”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“Node.js如何自定義對(duì)象事件的監(jiān)聽與發(fā)射”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識(shí)吧。

一、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

讀到這里,這篇“Node.js如何自定義對(duì)象事件的監(jiān)聽與發(fā)射”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI