iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >JS中自定义事件与观察者模式实例分析
  • 408
分享到

JS中自定义事件与观察者模式实例分析

2023-07-02 14:07:14 408人浏览 安东尼
摘要

这篇文章主要介绍了js中自定义事件与观察者模式实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JS中自定义事件与观察者模式实例分析文章都会有所收获,下面我们一起来看看吧。一、前言观察者模式 也称发布-订阅

这篇文章主要介绍了js中自定义事件与观察者模式实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JS中自定义事件与观察者模式实例分析文章都会有所收获,下面我们一起来看看吧。

一、前言

观察者模式 也称发布-订阅模式 、 模型-视图模式 。当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。

观察者模式: 类似我们在微信平台订阅了公众号 , 当它有新的文章发表后,就会推送给我们所有订阅的人。

我们作为订阅者不必每次都去查看这个公众号有没有新文章发布,公众号作为发布者会在合适时间通知我们。

我们与公众号之间不再强耦合在一起。公众号不关心谁订阅了它, 不管你是男是女还是宠物狗,它只需要定时向所有订阅者发布消息即可。

二、观察者模式优缺点

优点:

  • 可以广泛应用于异步编程,它可以代替我们传统的回调函数。

  • 我们不需要关注对象在异步执行阶段的内部状态,我们只关心事件完成的时间点。

  • 取代对象之间硬编码通知机制,一个对象不必显式调用另一个对象的接口,而是松耦合的联系在一起。

  • 降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系。符合依赖倒置原则。

缺点:

  • 如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。

  • 如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。

  • 观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。

三、代码实现

  • Event简易版

var Event = (function() {  let list = {};  let listen = function(key, fn) {    (list[key] || (list[key] = [])).push(fn);  };  let remove = function(key, fn) {    let fns = list[key];    if (!fns) return;    if (!fn) {      fns && (fns.length = 0);    } else {      for (let i = fns.length - 1; i >= 0; i--) {        fns[i] === fn && (fns.splice(i, 1));      }    }  };  let trigger = function() {    let keys = [].shift.call(arguments);    let fns = list[keys];    if (!fns || fns.length === 0) return;    for (let i = 0, fn; fn = fns[i++];) {      fn.apply(this, arguments);    }  };  return {    listen,    remove,    trigger  };})();// 使用function log(name) {  console.log(name)}Event.listen('to-do', log)    // 订阅事件Event.trigger('to-do', '111') // 111Event.trigger('to-do', '222') // 222Event.remove('to-do', log)    // 移除事件Event.trigger('to-do', '333') // 不执行
  • 类似nodejs的EventEmitter模拟版

function EventEmitter() {  this._maxListeners = 10;  this._events = Object.create(null);}// 向事件队列添加事件// prepend为true表示向事件队列头部添加事件EventEmitter.prototype.addListener = function (type, listener, prepend) {  if (!this._events) {    this._events = Object.create(null);  }  if (this._events[type]) {    if (prepend) {      this._events[type].unshift(listener);    } else {      this._events[type].push(listener);    }  } else {    this._events[type] = [listener];  }};// 移除某个事件EventEmitter.prototype.removeListener = function (type, listener) {  if (Array.isArray(this._events[type])) {    if (!listener) {      delete this._events[type]    } else {      this._events[type] = this._events[type].filter(e => e !== listener && e.origin !== listener)    }  }};// 向事件队列添加事件,只执行一次EventEmitter.prototype.once = function (type, listener) {  const only = (...args) => {    listener.apply(this, args);    this.removeListener(type, listener);  }  only.origin = listener;  this.addListener(type, only);};// 执行某类事件EventEmitter.prototype.emit = function (type, ...args) {  if (Array.isArray(this._events[type])) {    this._events[type].forEach(fn => {      fn.apply(this, args);    });  }};// 设置最大事件监听个数EventEmitter.prototype.setMaxListeners = function (count) {  this.maxListeners = count;};// 使用var emitter = new EventEmitter();var onceListener = function (args) {  console.log('我只能被执行一次', args, this);}var listener = function (args) {  console.log('我是一个listener', args, this);}emitter.once('click', onceListener);emitter.addListener('click', listener);emitter.emit('click', '参数');emitter.emit('click');emitter.removeListener('click', listener);emitter.emit('click');

四、DOM自定义事件api

  • Event构造器

// 创建var customEvent = new Event('custom-event');// 监听window.addEventListener('custom-event', function(e) {  // do something ...  console.log(`事件对象:`, e)})// 触发window.dispatchEvent(customEvent)
  • CustomEvent构造器,可传递参数。

// 创建var customEvent = new CustomEvent('custom-event', {  data: {    name: 'Tom',    age: 18,    other: 'otherMessage',  }});// 监听var eBox = document.getElementById('box')eBox.addEventListener('custom-event', function(e) {  // do something ...  console.log(`传入的数据:`, e.data)})// 触发 兼容写法if(window.dispatchEvent) {  eBox.dispatchEvent(customEvent);} else {  // IE8  eBox.fireEvent(customEvent);}

关于“JS中自定义事件与观察者模式实例分析”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“JS中自定义事件与观察者模式实例分析”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

--结束END--

本文标题: JS中自定义事件与观察者模式实例分析

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

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

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • JS中自定义事件与观察者模式实例分析
    这篇文章主要介绍了JS中自定义事件与观察者模式实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JS中自定义事件与观察者模式实例分析文章都会有所收获,下面我们一起来看看吧。一、前言观察者模式 也称发布-订阅...
    99+
    2023-07-02
  • JS中自定义事件与观察者模式详解
    目录一、前言二、观察者模式优缺点三、代码实现四、DOM自定义事件API一、前言 观察者模式 也称发布-订阅模式 、 模型-视图模式 。当对象间存在一对多关系时,则使用观察者模式(Ob...
    99+
    2024-04-02
  • Java观察者模式实例分析
    这篇文章主要讲解了“Java观察者模式实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java观察者模式实例分析”吧!使用场景观察者模式所做的工作其实就是在解耦,让耦合的双方都依赖于抽...
    99+
    2023-06-27
  • Java观察者模式实例代码分析
    这篇“Java观察者模式实例代码分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java观察者模式实例代码分析”文章吧。优...
    99+
    2023-06-29
  • Vue2.0中观察者模式的示例分析
    这篇文章主要介绍了Vue2.0中观察者模式的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1.Vue1.0 事件的广播与接收(观察者...
    99+
    2024-04-02
  • Javascript中观察者模式的示例分析
    这篇文章主要为大家展示了“Javascript中观察者模式的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Javascript中观察者模式的示例分析”这...
    99+
    2024-04-02
  • Java中观察者模式与委托的实例对比分析
    这篇文章主要介绍“Java中观察者模式与委托的实例对比分析”,在日常操作中,相信很多人在Java中观察者模式与委托的实例对比分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中观察者模式与委托的实例对...
    99+
    2023-06-30
  • PHP观察者模式的应用实例分析
    本篇内容主要讲解“PHP观察者模式的应用实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP观察者模式的应用实例分析”吧!PHP 观察者模式应用场景实例详解代码<phpheader...
    99+
    2023-06-21
  • java实现观察者模式的示例分析
    小编给大家分享一下java实现观察者模式的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!定义:定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则...
    99+
    2023-05-30
    java
  • web前端中观察者模式的示例分析
    这篇文章给大家分享的是有关web前端中观察者模式的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。观察者模式(Observer Pattern)观察者模式又称发布-订阅模式...
    99+
    2024-04-02
  • Python中行为型观察者模式的示例分析
    这篇文章主要介绍Python中行为型观察者模式的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、观察者模式观察者模式,必须包含 “观察者” 和 “被观察者” 这两个角色,并且观察者和被观察者之间存在 “观察...
    99+
    2023-06-29
  • web开发中发布订阅模式与观察者模式的示例分析
    这篇文章主要为大家展示了“web开发中发布订阅模式与观察者模式的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“web开发中发布订阅模式与观察者模式的示例...
    99+
    2024-04-02
  • 分析Lua观察者模式最佳实践之构建事件分发系统
    目录一、前言二、观察者模式三、事件分发系统四、使用事件分发系统解决问题五、注册监听事件接口六、反注册事件监听接口七、事件派发接口八、更多一、前言 试想这样一个问题,当某个事件发生时,...
    99+
    2024-04-02
  • JavaScript设计模式之观察者模式的的示例分析
    这篇文章主要介绍JavaScript设计模式之观察者模式的的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!本文实例讲述了JavaScript设计...
    99+
    2024-04-02
  • Vue响应式数据中的观察者模式实例简析
    这篇文章主要介绍“Vue响应式数据中的观察者模式实例简析”,在日常操作中,相信很多人在Vue响应式数据中的观察者模式实例简析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vu...
    99+
    2024-04-02
  • 如何实现观察者模式及Spring中的事件编程模型
    这篇“如何实现观察者模式及Spring中的事件编程模型”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来...
    99+
    2024-04-02
  • JavaScript观察者模式:掌控事件流,实现数据同步
    1. JavaScript观察者模式概述 JavaScript观察者模式是一种设计模式,它允许对象订阅并响应其他对象的事件。这种模式非常适合用于管理事件流和实现数据同步。在观察者模式中,有一个被观察者对象(Subject)和多个观察者对...
    99+
    2024-02-03
    JavaScript 观察者模式 事件流 数据同步
  • Java实现数据更新和事件通知的观察者模式
    目录介绍实现总结优点缺点应用场景介绍 Java观察者模式(也称发布-订阅模式)是一种行为设计模式,用于对象之间的松散耦合,即当一个对象的状态发生变化时,其他依赖该对象的对象会被自动通...
    99+
    2023-05-17
    Java观察者模式 Java设计模式
  • 浅析JavaScript观察者模式:理解事件处理机制的精髓
    JavaScript观察者模式是一种设计模式,它允许对象订阅和发布事件。这种模式非常适合用于构建事件驱动的应用程序,例如GUI或游戏。 在观察者模式中,发布者对象负责将事件发送给订阅者对象。订阅者对象负责处理这些事件。发布者对象和订阅者...
    99+
    2024-02-03
    JavaScript 观察者模式 事件处理 订阅 发布
  • JavaScript观察者模式:深入剖析,掌握事件驱动的艺术
    观察者模式是一种设计模式,它可以让你创建松散耦合的系统。在松散耦合的系统中,对象可以独立于彼此更改。这使得观察者模式非常适合于构建复杂的系统,这些系统需要能够轻松地扩展和更改。 观察者模式的工作原理如下: 首先,你需要创建一个被观察者...
    99+
    2024-02-03
    设计模式 JavaScript 观察者模式 事件处理
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作