千家信息网

js重构怎么实现

发表于:2025-02-23 作者:千家信息网编辑
千家信息网最后更新 2025年02月23日,这篇文章主要介绍"js重构怎么实现"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"js重构怎么实现"文章能帮助大家解决问题。思路:创建EmitterTarget
千家信息网最后更新 2025年02月23日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;//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][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

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

事件 函数 类型 对象 方法 实例 数据 注册表 元素 重构 中介 位置 参数 属性 知识 观察者 观察 代码 数组 模式 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 杭州淘啊网络技术有限公司 网络安全好书推荐 宁波东方网络技术有限公司 网络安全国际标准化在线课程预告 网络安全伴我成长手抄报四年级 医疗网络安全隐患 公安局网络安全岗位难吗 数据库创建表需要外键吗 有线网络无法连接服务器 登录域提示服务器上的安全数据库 网络安全问题试题 普陀区节能软件开发厂家直销 秦皇岛货币量化交易软件开发费用 vfp数据库设计器 服务器主板不插风扇不启动 交通行业网络安全培训方案 高速公路开展网络安全培训 全潮汇网络技术是做什么的 魔兽世界tbc服务器排行 怎样同时管理100台服务器 重庆政府软件开发软件 广州软件学院网络技术系 热迁移导致数据库损坏 与民航安全有关的数据库 万网 数据库主机 衡阳网络安全技术提升哪家好 阿里云服务器 带宽选择 2020年网络技术挑战赛总决赛 烟台鲨鱼软件开发公司 线上数据库技术
0