我的编程空间,编程开发者的网络收藏夹
学习永远不晚

js重构怎么实现

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

js重构怎么实现

这篇文章主要介绍“js重构怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“js重构怎么实现”文章能帮助大家解决问题。

  思路:

  创建EmitterTarget类和EmitterEvent类。

  EmitterTarget类主要使用了中介模式+观察者模式

  其中EmitterTarget类的实例化属性list充当中介角色,每当执行add方法时,给EmitterTarget类的实例化对象注册事件名称及触发函数;每当该对象执行remove方法时,从list列表中移除注册的事件及触发函数;

  dispatchEvent方法主要是发送事件对象本体,目的是为了在指定时刻触发事件函数以及传递数据参数。

  ==EmitterTarget类实例化对象本身就是观察者,观察者的特点是有add,remove,触发改变的函数(update或这里的dispatchEvent),以及应该有用于存放注册信息的属性或者单例对象。

  ==EmitterEvent类主要是用来创建事件对象本身,在创建时声明需要触发的事件类型以及需要携带的参数。

  EmitterTarget.ts代码如下:

  import EmitterEvent from "./EmitterEvent";

  interface IEvent{//中介者即存储实例化对象绑定的事件的list的数据规范接口

  [key:string]:Array<Function | null>;//key是事件名,value是触发事件函数数组

  }

  export default class EmitterTarget{

  private list:IEvent={};//私有变量list,只用于方法内部数据存储通信

  constructor(){

  }

  public addEventListener(type:string,handler:Function):void{

  if(!this.list[type])this.list[type]=[];//根据实例化对象传进来的事件类型判断list列表中是否注册该事件类型,如果没注册过,则创建这个字段

  var index=this.list[type].indexOf(handler);//看对应的事件中绑定的触发函数数组中是否存在这个触发函数

  if(index>-1) this.list[type][index]=handler;//存在则覆盖

  this.list[type].push(handler);//如果触发函数之前没有则在对应事件绑定的触发函数数组中新增

  }

  public removeEventListener(type:string,handler?:Function):void{

  if(!this.list[type])return;//如果list注册表中无事件注册,则删除无意义,直接返回

  if(handler===undefined){//如果调用该方法没有传要删除事件类型对应的触发函数就直接将该事件类型对应的全部触发函数删除

  for(var i=0;i<this.list[type].length;i++){

  this.list[type][i]=null;

  }

  this.list[type].length=0;

  return;

  }

  var index=this.list[type].indexOf(handler as Function);//这里用了断言,传进来了事件对应的触发函数,所以这里直接删除指定的那个

  if(index<0) return;

  this.list[type][index]=null;

  }

  public dispatchEvent(evt:EmitterEvent):void{//抛发事件

  if(!evt.type) throw new Error("错误的事件类型");//要抛发的事件一定要有事件类型

  evt.currentTarget=this;//抛发先给参数,将抛发事件的主人绑定给这个抛发事件对象,以便后面注册列表,事件类型对应的触发函数中需要使用到

  // var target=this;

  // while(target){//这里相当于循环深度递归,去冒泡一直找当前this的父元素...(用于dom元素)

  //     if(target.parentElement)evt.path.push(target.parentElement);

  //     target=target.parentElement;

  // }

  if(!this.list[evt.type]) return;//再次重复一次,必须声明事件类型

  for(var i:number=0;i<this.list[evt.type].length;i++){//根据事件类型去注册表里找对应的触发函数,这里执行的同时还要改变内部this执向

  if(this.list[evt.type][i]) (this.list[evt.type][i] as Function).call(this,evt);

  }

  for (var j: number = 0; j < this.list[evt.type].length; j++){//这里再做了一次操作,在执行完注册表内事件类型对应的触发函数后,去将触发函数数组中为null的触发函数位置取消

  // (可能程序的其他地方已经将数组里的某些触发函数删除了(执行removeEventListener方法), 但是没把占的位置取消, 这里将该位置取消了)

  if(!this.list[evt.type][j]){

  this.list[evt.type].splice(j,1);

  j--;//splice()后j--是表示删除之后j需要回退一步,因为这里是遍历操作,

  // 如果不回退则被删除元素后面那个元素就不会再被检测直接跳过

  }

  }

  }

  }

  EmitterTarget.ts代码如下:

  import EmitterTarget from "./EmitterTarget";

  export default class EmitterEvent{

  public type:string;

  public currentTarget?:EmitterTarget;

  //target.dispatchEvent(evt);如这里的evt.currentTarget===target(在dispatchEvent方法内部绑定evt.currentTarget=this)

  public data?:object;//!!!注意这里的传的数据是用于注册的事件类型的触发函数中;

  constructor(type:string,data?:object){//创建抛发的事件,主要有是事件类型,携带的数据,

  this.type=type;

  this.data=data;

  }

  }

  使用demo:

  1.定义需要使用事件抛发的类

  import { IncomingMessage, ServerResponse } from "http";

  import EmitterEvent from "./EmitterEvent";

  import EmitterTarget from "./EmitterTarget";

  import IRes from "./IRes";

  import ResDataShow from "./ResDataShow";

  interface IResData{

  req:IncomingMessage;

  res:ServerResponse;

  data?:object;

  }

  export default class Main extends EmitterTarget{//main继承了EmitterTarget,所以这里有隐藏的list属性,用来充当注册表的角色

  private static _instance?:Main;

  constructor(){//给main的每个实例化对象都执行侦听ServerVo.DATA_LIST事件

  super();

  this.addEventListener(ServerVo.DATA_LIST,(e:EmitterEvent)=>this.dataHandler(e));//执行事件侦听方法时,在注册表中注册事件及其触发函数

  }

  static get instance():Main

  {

  if(!Main._instance) Main._instance=new Main();

  return Main._instance;

  }

  private dataHandler(e:EmitterEvent){//事件侦听的触发函数即回调函数

  var data:IResData=e.data as IResData;

  var command:IRes;

  command=new ResDataShow();

  command.exec(data.req,data.res,data.data);

  }

  }

  2.具体抛发操作

  import EmitterEvent from "./EmitterEvent";

  import Main from "./Main";

  var evt=new EmitterEvent(type,{req:req,res:res,data:dataObj});

  Main.instance.dispatchEvent(evt);//抛发事件,触发instance单例的绑定的函数

关于“js重构怎么实现”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

js重构怎么实现

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

js数组去重怎么实现

这篇文章主要介绍“js数组去重怎么实现”,在日常操作中,相信很多人在js数组去重怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”js数组去重怎么实现”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!方法
2023-07-02

js怎么实现嵌套数组重排序

这篇文章主要介绍“js怎么实现嵌套数组重排序”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“js怎么实现嵌套数组重排序”文章能帮助大家解决问题。总共遇到两个问题:1、JS中for循环输出同一变量值的问
2023-06-29

js模拟怎么实现重载以及默认参数

本篇内容主要讲解“js模拟怎么实现重载以及默认参数”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“js模拟怎么实现重载以及默认参数”吧!模拟实现重载以及默认参数众所周知,js是函数不支持重载和默认
2023-06-30

重载toString如何实现JS HashMap

重载toString如何实现JS HashMap,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。用过Java的都知道,里面有个功能强大的数据结构——HashMap
2023-06-17

js中怎么实现replaceAll

这篇文章给大家分享的是有关js中怎么实现replaceAll的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。说明1、replaceAll()可以一次性替换所有匹配。同replace()一样,该方法接收两个参数,第一
2023-06-20

JS分页怎么实现

实现JS分页可以通过以下步骤:1. 获取数据:从服务器或本地获取数据,并将数据存储在一个数组或对象中。2. 设置每页显示的数量和当前页码:确定每页要显示的数据数量,以及当前页码。3. 计算总页数:根据数据的总数和每页显示的数量,计算出总页数
2023-08-09

js数组怎么去重

js数组去重的方法:1、ES6提供的“new Set()”方法;2、“filter()”方法;3、使用for循环,搭配“indexOf()”方法;4、将数组的每一个元素依次与其他元素比较,有重复元素就删除;5、创建新的空数组,使用“inde
2023-07-10

js怎么实现ajax分页

这篇文章给大家分享的是有关js怎么实现ajax分页的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。什么是ajaxajax是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术,可以通过在后台与服务器进行少量数
2023-06-08

JS怎么实现loading加载

这篇文章主要讲解了“JS怎么实现loading加载”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JS怎么实现loading加载”吧!防抖节流自定义指令一、问题现象操作系统流程时,网速过慢,点
2023-07-05

怎么实现JS中的new

这篇文章主要介绍“怎么实现JS中的new”,在日常操作中,相信很多人在怎么实现JS中的new问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么实现JS中的new”的疑惑有所帮助!接下来,请跟着小编一起来学习吧
2023-06-25

JS怎么实现验证码

这篇文章主要介绍JS怎么实现验证码,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体代码:
2023-06-27

Java面向对象之继承、构造方法、重写、重载怎么实现

这篇“Java面向对象之继承、构造方法、重写、重载怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java面向对象之继
2023-07-05

js构造函数怎么用

这篇文章将为大家详细讲解有关js构造函数怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。说明1、构造函数名的首字母必须大写。构造函数无需return即可返回结果。2、调用结构函数必须使用new关键词,
2023-06-20

编程热搜

目录