function Events() {
// 放置所有添加的 监听事件
this._events = {}
}
Events.prototype = {
on: function (name, fn, ...argOrg) {
// 必传参数验证
if (!name || !fn) {
throw new Error(`[Events TypeError] Failed to execute 'Events' on '${name}' : arguments required`)
return
}
// 阻止重复添加相同的监听
let fns = this._events[name] || []
if(fns.find(item=> item.fnOrg===fn)){
return;
}
this._events[name] = fns.concat({
fn: arg => fn.apply(null, [...argOrg, ...arg]),
fnOrg:fn
})
},
once: function (name, fn, ...argOrg) {
const onFn = (...arg) =>{
fn.apply(null, arg)
this.off(name, onFn)
}
this.on(name, onFn, ...argOrg)
},
emit: function (name, ...arg) {
(this._events[name]||[]).forEach(item =>{
item.fn(arg)
})
},
off: function (name,fn) {
// 无参数 : 清掉所有监听
if(!arguments.length){
this._events = Object.create(null)
}
// 一个参数 : 清掉该事件名下所有监听
if(arguments.length==){
delete this._events[name]
}
let fns = this._events[name];
if(!fns || !fns.length)return;
this._events[name] = (fns||[]).filter(item=> {
return item.fnOrg !== fn
});
}
}
// 调用demo
const event = new Events();
const fn1 = (...args)=>console.log('I want sleep1',...args)
const fn2 = (...args)=>console.log('I want sleep2',...args)
// part1: 添加多次监听
event.on('sleep', fn1, , , );
event.on('sleep', fn2, , , );
event.emit('sleep', ,,);
// 输出
// I want sleep1 1 2 3 4 5 6
// I want sleep2 1 2 3 4 5 6 // part2:once监听 只触发一次
event.once('sleep1', fn1, , );
event.emit('sleep1',);
event.emit('sleep1',);
// 输出
// I want sleep1 11 12 13 // part3: 重复监听“相同回调”无效(匿名函数除外)
event.on('sleep2', fn2, );
event.on('sleep2', fn2, );
event.emit('sleep2',);
// 输出
// I want sleep2 22 25 // part3: 清除监听
event.off('sleep2', fn2);
event.off('sleep1'); // 清除该事件下所有监听
event.off(); // 全部清除
event.emit('sleep2',);
// 输出
// 无

使用原生代码实现一个Events模块,可以实现自定义事件的订阅、触发、移除功能的更多相关文章

  1. python 控制语句基础---->代码块:以为冒号作为开始,用缩进来划分作用域,代表一个整体,是一个代码块,一个文件(模块)也称为一个代码块 | 作用域:作用的范围

    # ### 代码块:以为冒号作为开始,用缩进来划分作用域,代表一个整体,是一个代码块,一个文件(模块)也称为一个代码块 # ### 作用域:作用的范围 print(11) print(12) prin ...

  2. js原生代码编写一个鼠标在页面移动坐标的检测功能,兼容各大浏览器

    function mousePosition(e) {     //IE9以上的浏览器获取     if (e.pageX || e.pageY) {         return {         ...

  3. Backbone事件管理——Backbone.Events模块API结构

    模块Backbone.Events的事件管理是通过Backbone提供的Events API来实现的,该API在1.0版本之前仅仅提供了几个基本的方法,如on.off.trigger.once分别执行 ...

  4. 模块(类)之间解耦利器:EventPublishSubscribeUtils 事件发布订阅工具类

    如果熟悉C#语言的小伙伴们一般都会知道委托.事件的好处,只需在某个类中提前定义好公开的委托或事件(委托的特殊表现形式)变量,然后在其它类中就可以很随意的订阅该委托或事件,当委托或事件被触发执行时,会自 ...

  5. 用原生JS实现一个轮播(包含全部代码和详细思路)

    在我看来要想实现轮播主要是要知道当前位于的页面和即将位于的页面.这个案例是通过改变图片的透明度来实现轮播的效果. 我把涉及的知识点分为两个方面,分别是HTML+css和JS. 第一部分(html+cs ...

  6. [代码]--IIS发布网站浏览之后看到的是文件目录 & Internal Server Error 处理程序“ExtensionlessUrlHandler-ISAPI-4.0_64bit”在其模块列表中有一个错误模块“IsapiModule” 解决方法 & App_global.asax.pduxejp_.dll”--“拒绝访问。 ”

    Q:IIS发布网站浏览之后看到的是文件目录 A:它出现了一个说到.NET4.0 更高框架什么的错误,所以我将 .NTE CRL版本由4.0改为2.0了,改为2.0后就出现了只能浏览文件目录了.改为4. ...

  7. 深入出不来nodejs源码-events模块

    这一节内容超级简单,纯JS,就当给自己放个假了,V8引擎和node的C++代码看得有点脑阔疼. 学过DOM的应该都知道一个API,叫addeventlistener,即事件绑定.这个东西贯穿了整个JS ...

  8. Cordova - 与iOS原生代码交互2(使用Swift开发Cordova的自定义插件)

    在前一篇文章中我介绍了如何通过 js 与原生代码进行交互(Cordova - 与iOS原生代码交互1(通过JS调用Swift方法)),当时是直接对Cordova生成的iOS工程项目进行编辑操作的(添加 ...

  9. events模块

    /** * Created by Administrator on 2016/8/3. */ var http = require("http"); //Node 导入文件系统模块 ...

随机推荐

  1. Java_用*输出等腰三角形

    // 代码............................................................... import java.util.Scanner;public ...

  2. Java_计算1-100的和,奇数和

    public class Work1{ public static void main(String[] args){ // 定义和并赋值 int sum = 0; for(int i = 1;i & ...

  3. HashMap面试必问的6个点,你知道几个?

    一.HashMap的实现原理? 此题可以组成如下连环炮来问 你看过HashMap源码嘛,知道原理嘛? 为什么用数组+链表? hash冲突你还知道哪些解决办法? 我用LinkedList代替数组结构可以 ...

  4. 这道面试必问的JVM面试题70%的Java程序员会做错

    前言 聊聊JVM,一个熟悉又陌生的名词,从认识Java的第一天起,我们就会听到这个名字,在参加工作的前一两年,面试的时候还会经常被问到JDK,JRE,JVM这三者的区别. JVM可以说和我们是老朋友了 ...

  5. C语言每日一练——第2题

    一.题目要求 已知数据文件in.dat中存有300个四位数,并调用读函数readDat()把这些数存入数组a中,请编制一函数jsValue(),其功能是:求出所有这些四位数是素数的个数cnt,再求出所 ...

  6. Centos7 Openresty 开发环境

    首先要安装编译环境 yum group install "Development Tools" yum install pcre-devel openssl-devel gcc c ...

  7. git 知识,适合新手 滤清思路

    1,密钥 (公钥和私钥) @ 公钥放在服务器上(说白了这里的服务器就是远程仓库, 就是谁建立的远程仓库这个公钥就放在他的ssh设置那) @ 私钥 放在本地就行,不用动,就是你生产密钥的.ssh 文件里 ...

  8. Instrument API介绍

    1. Instrumentation介绍  JVMTI(JVM Tool Interface)是 Java 虚拟机所提供的 native 编程接口,是 JVMPI(Java Virtual Machi ...

  9. css应用视觉设计

    应用视觉设计:创建一个 CSS 线性渐变 HTML元素的背景色并不局限于单色.css还提供了颜色过渡,也就是渐变.可以通过background里面的linear-gradient()来实现线性渐变,下 ...

  10. ActiveMQ消息队列从入门到实践(4)—使用Spring JMS收发消息

    Java消息服务(Java Message Service ,JMS)是一个Java标准,定义了使用消息代理的通用API .在JMS出现之前,每个消息代理都有私有的API,这就使得不同代理之间的消息代 ...