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继承。关于原型对象原型链这个写的挺不错:http://www.cnblogs.com/shuiyi/p/5305435.html

只需将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
时间: 2024-12-23 07:36:50

Node.js自定义对象事件监听与发射的相关文章

js 的 load 事件监听问题及事件监听的添加移除实例

当我在 html 页面里写入 js ,绑定 load 事件的时候: window.addEventListener("load", test, false);function test(){console.log("test");} 这个时候是可以正常调用 test 函数的.但是当我结合 requirejs 把事件监听放在外部引入的 js 文件里,就没办法正常监听了,求解决办法及原因 回复: 引入你这个 js 之前页面就已经 load 完毕了,解决办法就是先判断页面

javascript支持匿名函数的事件监听封装

关于js中的事件监听大家用的比较多了,无非是判断浏览器是否支持addEventListener和attachEvent,网上搜索关于事件监听的方法也挺多,但是总有些不是很完善.下面的方法中对于添加事件监听的方法是一样的,只不过在取消事件绑定上面做了点手术,现在可以支持匿名函数的使用,所以在绑定事件的时候不再需要给函数单独命名了. 先看demo:    代码如下 复制代码 <!DOCTYPE html> <html> <head profile="http://www

cocos2d x-cocos如何将事件监听封装到自定义的精灵类中,求一个demo

问题描述 cocos如何将事件监听封装到自定义的精灵类中,求一个demo cocos如何将事件监听封装到自定义的精灵类中,求一个demo.每次创建新的精灵时就会添加触摸监听.在其他层中可以拖拽移动这些添加到层中的精灵 解决方案 把你的方法放进init()里面,继承layer或者node,create()后就会调用.具体的点击事件,你可以百度,很多 解决方案二: 把你的方法放进init()里面,继承layer或者node,create()后就会调用.具体的点击事件,你可以百度,很多 解决方案三:

JS 事件绑定、事件监听、事件委托详细介绍_基础知识

在JavaScript的学习中,我们经常会遇到JavaScript的事件机制,例如,事件绑定.事件监听.事件委托(事件代理)等.这些名词是什么意思呢,有什么作用呢? 事件绑定 要想让 JavaScript 对用户的操作作出响应,首先要对 DOM 元素绑定事件处理函数.所谓事件处理函数,就是处理用户操作的函数,不同的操作对应不同的名称. 在JavaScript中,有三种常用的绑定事件的方法: 在DOM元素中直接绑定: 在JavaScript代码中绑定: 绑定事件监听函数. 在DOM中直接绑定事件

js事件监听机制(事件捕获)总结_javascript技巧

在前端开发过程中我们经常会遇到给页面元素添加事件的问题,添加事件的js方法也很多,有直接加到页面结构上的,有使用一些js事件监听的方法,由于各个浏览器对事件冒泡事件监听的机制不同,le浏览器只有事件冒泡,没有事件监听的机制,对于事件监听的兼容性问题是最大的难题: 1.直接把事件的方法写在页面结构上 function eventfun(){ //console.log(this); } <input type="button" onclick="eventfun()&qu

Vue.JS入门教程之事件监听_javascript技巧

你可以使用 v-on 指令来绑定并监听 DOM 事件.绑定的内容可以是一个当前实例上的方法 (后面无需跟括号) 或一个内联表达式.如果提供的是一个方法,则原生的 DOM event 会被作为第一个参数传入,同时这个 event 会带有 targetVM 属性,指向触发该事件的相应的 ViewModel: <div id="demo"> <a v-on="click: onClick">触发一个方法函数</a> <a v-on

js实现滑动触屏事件监听的方法

  这篇文章主要介绍了js实现滑动触屏事件监听的方法,适用于手机端触屏滑动事件的监听技巧,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了js实现滑动触屏事件监听的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 function span_move_fun(){

js实现滑动触屏事件监听的方法_javascript技巧

本文实例讲述了js实现滑动触屏事件监听的方法.分享给大家供大家参考.具体实现方法如下: function span_move_fun(){ var span = document.getElementById("move_k"); var span_left = $(span).offset().left; var span_top = $(span).offset().top; var start_left = $(span).offset().left; var start_top

Js事件监听封装(支持匿名函数)

主要代码:  代码如下 复制代码 /*绑定事件与取消绑定*/ var handleHash = {}; var bind = (function() {  if (window.addEventListener) {   return function(el, type, fn, capture) {    el.addEventListener(type, function(){     fn();     handleHash[type] = handleHash[type] || [];