javscript创建Emitter
本文简单叙述下javascript是如何建立一个Emitter构造函数的。
/**
* 定义Emitter构造函数
*/ function Emitter() { } /**
* 添加监听事件
*/ Emitter.prototype.on =
Emitter.prototype.addEventListener = function(event, fn){
this._callbacks = this.callbacks || {};
(this._callbacks[event] = this._callbacks[event] || []).push(fn);
return this;
}
/**
* 添加一个一次性监听事件
*/ Emitter.prototype.once = function(event, fn){
var self = this;
this._callbacks = this._callbacks || {}; function on() {
self.off(event, on);
fn.apply(this, arguments);
} on.fn = fn;
this.on(event, on);
return this;
}; /**
* 移除已经添加的监听事件
*/ Emitter.prototype.off =
Emitter.prototype.removeListener =
Emitter.prototype.removeAllListeners =
Emitter.prototype.removeEventListener = function(event, fn){
this._callbacks = this._callbacks || {}; // 所有事件
if (0 == arguments.length) {
this._callbacks = {};
return this;
} // 指定事件
var callbacks = this._callbacks[event];
if (!callbacks) return this; // 移除对应的事件回调
if (1 == arguments.length) {
delete this._callbacks[event];
return this;
} var cb;
for (var i = 0l i< callbacks.length; i++) {
cb = callbacks[i];
if (cb === fn || cb.fn === fn) {
callbacks.splice(i, 1);
break;
}
}
return this;
}; /**
* 手动触发指定event事件
*/ Emitter.prototype.emit = function(event){
this._callbacks = this._callbacks || {};
var args = [].slice.call(arguments, 1),
callbacks = this._callbacks[event];
if (callbacks) {
callbacks = callbacks.slice(0);
for (var i = 0, len = callbacks.length; i< len; i++){
callbacks[i].apply(this, args);
}
} return this;
}; /**
* 返回指定event的回调数组
*/ Emitter.prototype.listeners = function(event){
this._callbacks = this._callbacks || {};
return this._callbacks[event] || [];
}; /**
* 判断该Emitter是否有指定event的回调
*/ Emitter.prototype.hasListeners = function(event){
return !!this.listeners(event).length;
};
第一次写javascript分析,写下来还是发现有好多蹩脚的名字翻译,说明以后还是得多多练习才是。
javscript创建Emitter的更多相关文章
- Christmas Trees, Promises和Event Emitters
今天有同事问我下面这段代码是什么意思: var MyClass = function() { events.EventEmitter.call(this); // 这行是什么意思? }; util.i ...
- Qt终结者之粒子系统
前言 粒子系统用于模拟一些特定的模糊效果,如爆炸.烟火.雪花.水流等.使用传统的渲染技术实现粒子效果比较困难,但是使用QML粒子系统能十分方便的实现各种粒子效果,使你的界面更加炫酷,动感. QML中的 ...
- Flink - Asynchronous I/O
https://docs.google.com/document/d/1Lr9UYXEz6s6R_3PWg3bZQLF3upGaNEkc0rQCFSzaYDI/edit // create the ...
- unity-Timeline实践
前言 建议入门方式(基本的手册知识了解之后):官方Demo TimelineInputDemo 自定义轨迹 CustomTrack Signal 标记 创建Emitter 和 Receiver 引用: ...
- Javscript高级
Javscript高级: 函数内部属性 arguments: arguments(实参:包含所有传入方法的参数)特殊用法: arguments中有一个属性callee,是一个指针,指向拥有这个argu ...
- Flink Program Guide (5) -- 预定义的Timestamp Extractor / Watermark Emitter (DataStream API编程指导 -- For Java)
本文翻译自Pre-defined Timestamp Extractors / Watermark Emitter ------------------------------------------ ...
- 创建简单的响应式HTML5模版
创建简单的响应式HTML5模版 HTML5目前发展势头良好,已经逐渐得到大部分浏览器不同程度的支持.许多web开发者也已经学习到了不少关于HTML 5的基础知识并开始试图使用HTML 5制作网页.与此 ...
- 利用Flare3D和Stage3D创建3D
Flare3D 是一款功能强大的引擎,它使得 Flash 中的 3D 内容管理变得更为简便. 它的设计宗旨是提供一个完美的开发工作流程,以便你能够获得事半功倍的效果. 本教程侧重讨论在 Flash 中 ...
- UVW源码漫谈(番外篇)—— Emitter
这两天天气凉了,苏州这边连续好几天都是淅淅沥沥的下着小雨,今天天气还稍微好点.前两天早上起来突然就感冒了,当天就用了一卷纸,好在年轻扛得住,第二天就跟没事人似的.在这里提醒大家一下,天气凉了,睡凉席的 ...
随机推荐
- UDP传输
@@@基于UDP的客服端代码 public class Service { // 服务器 public static void main(String[] args) { DatagramPacket ...
- GDI与GDI+ 贴图性能对比
在做绘图相关工作,由于对显示绘制结果实时性有要求,筛选了GDI , 与GDI+ 贴图性能. 这里假设在内存中已绘制完成一张图片,现需求显示在控件上,同时,总是更新全部区域. GDI+ 实现 priva ...
- 用JS获取地址栏参数的方法(超级简单)
方法一:采用正则表达式获取地址栏参数:( 强烈推荐,既实用又方便!) function GetQueryString(name) { var reg = new RegExp("( ...
- php 数据库select函数//待编辑
<?php $con = mysql_connect("localhost","root","root"); if (!$con) { ...
- 针对不同浏览器,CSS如何写
我们在开发DIV+CSS页面时候常常会遇到开发出的网页的一些地方在各大浏览器比如微软IE6.微软IE7.微软IE8.火狐浏览器.谷歌浏览器有一些不同,如宽度.高度等地方有相差误.IE6比较老的版本浏览 ...
- Andriod Studio adb.exe,start-server' failed -- run manually if necessary 解决
首先查看了我的任务管理器,共有三个adb的程序在运行: 错误提示的是 Andriod Studio 中的adb.exe启动失败,于是,去关掉另外两个adb.exe,两分钟左右后,又出现了三个adb. ...
- android studio 中依赖库compile 的一些库的地址
1.添加Gson的依赖库 compile 'com.google.code.gson:gson:2.2.4' 2.使用Volley执行网络数据传输的依赖库 compile 'com.mcxiaoke. ...
- is a 、like a、has a
has a 代表的是对象和它的成员的从属关系.可以分为组合与聚合两种. 组合:表示两个对象是整体与部分的关系为强关系 聚合:表示两个对象是整体与部分的关系为弱关系 is a 它是类继承关系,只是覆盖了 ...
- DotNetBar for Windows Forms 12.2.0.7_冰河之刃重打包版原创发布-带官方示例程序版
关于 DotNetBar for Windows Forms 12.2.0.7_冰河之刃重打包版 --------------------11.8.0.8_冰河之刃重打包版-------------- ...
- Python开发入门与实战18-Windows Azure 虚拟机部署
18. 微软云虚拟机部署 上一章节我们介绍了如何在新浪云部署我们的在python django应用,本章我们来介绍如何Windows Azure上部署我们的应用. 18.1. 注册Windows Az ...