返回顶部
首页 > 资讯 > 前端开发 > VUE >js重构怎么实现
  • 697
分享到

js重构怎么实现

2024-04-02 19:04:59 697人浏览 独家记忆
摘要

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

这篇文章主要介绍“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重构怎么实现”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网VUE频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: js重构怎么实现

本文链接: https://lsjlt.com/news/96244.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • js重构怎么实现
    这篇文章主要介绍“js重构怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“js重构怎么实现”文章能帮助大家解决问题。   思路:   创建EmitterT...
    99+
    2024-04-02
  • js数组去重怎么实现
    这篇文章主要介绍“js数组去重怎么实现”,在日常操作中,相信很多人在js数组去重怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”js数组去重怎么实现”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!方法...
    99+
    2023-07-02
  • js怎么实现嵌套数组重排序
    这篇文章主要介绍“js怎么实现嵌套数组重排序”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“js怎么实现嵌套数组重排序”文章能帮助大家解决问题。总共遇到两个问题:1、JS中for循环输出同一变量值的问...
    99+
    2023-06-29
  • 怎么重写document.write实现无阻塞加载JS广告
    本篇内容主要讲解“怎么重写document.write实现无阻塞加载JS广告”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么重写document.write实...
    99+
    2024-04-02
  • js模拟怎么实现重载以及默认参数
    本篇内容主要讲解“js模拟怎么实现重载以及默认参数”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“js模拟怎么实现重载以及默认参数”吧!模拟实现重载以及默认参数众所周知,js是函数不支持重载和默认...
    99+
    2023-06-30
  • 重载toString如何实现JS HashMap
    重载toString如何实现JS HashMap,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。用过Java的都知道,里面有个功能强大的数据结构——HashMap...
    99+
    2023-06-17
  • js中怎么实现replaceAll
    这篇文章给大家分享的是有关js中怎么实现replaceAll的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。说明replaceAll()可以一次性替换所有匹配。同replace()一样,该方法接收两个参数,第一个参...
    99+
    2023-06-20
  • JS分页怎么实现
    实现JS分页可以通过以下步骤:1. 获取数据:从服务器或本地获取数据,并将数据存储在一个数组或对象中。2. 设置每页显示的数量和当前...
    99+
    2023-08-09
    JS
  • JS中如何实现数组去重
    这篇文章主要介绍JS中如何实现数组去重,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!操作的数组 let arr=[0,1,23,'1',4,2,8...
    99+
    2024-04-02
  • js实现嵌套数组重排序
    本文实例为大家分享了js实现嵌套数组重排序的具体代码,供大家参考,具体内容如下 总共遇到两个问题: 1、JS中for循环输出同一变量值的问题 js事件处理器在线程空闲事件不会运行,导...
    99+
    2024-04-02
  • js数组怎么去重
    js数组去重的方法:1、ES6提供的“new Set()”方法;2、“filter()”方法;3、使用for循环,搭配“indexOf()”方法;4、将数组的每一个元素依次与其他元素比较,有重复元素就删除;5、创建新的空数组,使用“inde...
    99+
    2023-07-10
  • JS怎么实现计算器
    这篇文章主要为大家展示了“JS怎么实现计算器”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JS怎么实现计算器”这篇文章吧。<!DOCTYPE h...
    99+
    2024-04-02
  • js怎么实现ajax分页
    这篇文章给大家分享的是有关js怎么实现ajax分页的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。什么是ajaxajax是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术,可以通过在后台与服务器进行少量数...
    99+
    2023-06-08
  • 怎么实现JS中的new
    这篇文章主要介绍“怎么实现JS中的new”,在日常操作中,相信很多人在怎么实现JS中的new问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么实现JS中的new”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-25
  • JS怎么实现验证码
    这篇文章主要介绍JS怎么实现验证码,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体代码:<!DOCTYPE html><html lang="en">...
    99+
    2023-06-27
  • JS怎么实现loading加载
    这篇文章主要讲解了“JS怎么实现loading加载”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JS怎么实现loading加载”吧!防抖节流自定义指令一、问题现象操作系统流程时,网速过慢,点...
    99+
    2023-07-05
  • Java面向对象之继承、构造方法、重写、重载怎么实现
    这篇“Java面向对象之继承、构造方法、重写、重载怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java面向对象之继...
    99+
    2023-07-05
  • js构造函数怎么用
    这篇文章将为大家详细讲解有关js构造函数怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。说明构造函数名的首字母必须大写。构造函数无需return即可返回结果。调用结构函数必须使用new关键词,只需ne...
    99+
    2023-06-20
  • JS如何实现数组去重复值
    这篇文章主要介绍JS如何实现数组去重复值,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!运行效果图如下:完整实例代码如下:<!DOCTYPE html PUB...
    99+
    2024-04-02
  • 如何使用JS实现数组去重
    这篇文章主要介绍如何使用JS实现数组去重,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体如下:var arr = ['abc',...
    99+
    2024-04-02
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作