JavaScript设计模式(二十一):驻华大使-访问者模式

简介: 驻华大使-访问者模式

访问者模式(Visitor)

针对于对象结构中的元素,定义在不改变该对象的前提下访问结构中元素的新方法。

解决this指向在IE下指向window的问题:

  • 错误示例:(IE8及以下this指向window

      /**
       * 绑定事件
       * @param {HTMLElement} el DOM元素
       * @param {string} type 事件类型 
       * @param {Function} fn 时间函数
       */
      function bindEvent(el, type, fn) {
         
          if (el.addEventListener) {
         
              el.addEventListener(type, fn, false);
          } else if (el.attachEvent) {
         
              el.attachEvent('on' + type, fn);
          } else {
         
              el['on' + type] = fn;
          }
      }
    
      var text = document.getElementById('text');
    
      bindEvent(text, 'click', function () {
         
          // 非IE下:     HTMLElement         false
          // IE8及以下:  [object Window]     true
          console.log(this, this === window);
    
          this.style.backgroundColor = 'red'; // IE8及以下报错
      });
    
    AI 代码解读
  • 解决IE8及以下报错问题:

      /**
       * 绑定事件
       * @param {HTMLElement} el DOM元素
       * @param {string} type 事件类型 
       * @param {Function} fn 时间函数
       */
      function bindEvent(el, type, fn) {
         
          if (el.addEventListener) {
         
              el.addEventListener(type, fn, false);
          } else if (el.attachEvent) {
         
              // 解决IE8及以下报错问题
              el.attachEvent('on' + type, function (e) {
         
                  fn.call(el, e); // 修改了回调函数的指向
              });
          } else {
         
              el['on' + type] = fn;
          }
      }
    
      var text = document.getElementById('text');
    
      bindEvent(text, 'click', function () {
         
          console.log(this); // 指向了HTMLElement
          this.style.backgroundColor = 'red';
      });
    
    AI 代码解读

为对象变量添加类似数组的方法

  • 数组操作方法(pop splice push):
      let b = [];
      b.name = 'Lee';
      b.age = 18;
      console.log(b.push(1, 2, 3, 4));            // 4
      console.log(b);                             // [1, 2, 3, 4, name: 'Lee', age: 18] ---> length: 4
      console.log(b.splice(1, 2));                // (2) [2, 3]
      console.log(b);                             // (2) [1, 4, name: 'Lee', age: 18] ---> length: 2
      console.log(b.pop());                       // 4
      console.log(b);                             // [1, name: 'Lee', age: 18] ---> length: 1
    
    AI 代码解读
  • 利用访问者模式实现对象变量访问数组上自带的事件方法:

      // 访问器
      var Visitor = (function () {
         
          return {
         
              // 追加数据方法
              push(...args) {
         
                  // 对第一个参数对象执行push方法
                  return Array.prototype.push.apply(args[0], args.slice(1));
              },
              // 截取方法
              splice(...args) {
         
                  // 对第一个参数对象执行splice方法
                  return Array.prototype.splice.apply(args[0], args.slice(1));
              },
              // 弹出最后一次添加的元素
              pop(...args) {
         
                  // 对第一个参数对象执行pop方法
                  return Array.prototype.pop.apply(args[0]);
              }
          }
      })();
    
      let a = {
          name: 'Lee', age: 18 };
    
      console.log(Visitor.push(a, 1, 2, 3, 4));   // 4
      console.log(a);                             // {0: 1, 1: 2, 2: 3, 3: 4, name: 'Lee', age: 18, length: 4}
    
      console.log(Visitor.splice(a, 1, 2));       // (2) [2, 3]
      console.log(a);                             // {0: 1, 1: 4, name: 'Lee', age: 18, length: 2}
    
      console.log(Visitor.pop(a));                // 4
      console.log(a);                             // {0: 1, name: 'Lee', age: 18, length: 1}
    
    AI 代码解读

特点:

访问者更适合于那些数据稳定,但是数据的操作方法易变的环境下。因此当操作环境改变时,可以自由修改操作方法以适应操作环境,而不用修改原数据实现操作方法的拓展

同时对于同一个数据,它可以被多个访问对象所访问,这极大增加了操作数据的灵活性

访问者模式指在不同的环境下都可以从容的进行事件调用及访问,以及使用对象去访问数组可以直接访问的方法。

目录
打赏
0
0
0
0
25
分享
相关文章
|
2月前
|
【设计模式】【行为型模式】访问者模式(Visitor)
一、入门 什么是访问者模式? 访问者模式(Visitor Pattern)是一种行为设计模式,允许你将算法与对象结构分离。通过这种方式,可以在不改变对象结构的情况下,向对象结构中的元素添加新的操作。
96 10
浅谈几种js设计模式
设计模式是软件开发中的宝贵工具,能够提高代码的可维护性和扩展性。通过单例模式、工厂模式、观察者模式和策略模式,我们可以解决不同场景下的实际问题,编写更加优雅和高效的代码。
70 8
Next.js 实战 (七):浅谈 Layout 布局的嵌套设计模式
这篇文章介绍了在Next.js框架下,如何处理中后台管理系统中特殊页面(如登录页)不包裹根布局(RootLayout)的问题。作者指出Next.js的设计理念是通过布局的嵌套来创建复杂的页面结构,这虽然保持了代码的整洁和可维护性,但对于特殊页面来说,却造成了不必要的布局包裹。文章提出了一个解决方案,即通过判断页面的skipGlobalLayout属性来决定是否包含RootLayout,从而实现特殊页面不包裹根布局的目标。
230 33
【再谈设计模式】访问者模式~操作对象结构的新视角
  访问者模式是一种行为设计模式,旨在解决对象结构与操作逻辑的耦合问题。在软件系统开发中,当面临复杂的对象结构(如多种类型对象组成的树形或图形结构),且需要对这些对象执行不同操作时,传统方式将操作直接写在对象类中会导致类职责过多,不利于维护和扩展。而访问者模式通过将操作与对象结构分离,允许在不改变现有对象结构的情况下定义新操作,元素接受访问者访问,访问者定义对不同类型元素的操作逻辑,从而为应对这种复杂情况提供了有效的解决方案。
83 0
JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式
本文深入探讨了JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式,结合电商网站案例,展示了设计模式如何提升代码的可维护性、扩展性和可读性,强调了其在前端开发中的重要性。
102 2
从工厂到单例再到策略:Vue.js高效应用JavaScript设计模式
【8月更文挑战第30天】在现代Web开发中,结合使用JavaScript设计模式与框架如Vue.js能显著提升代码质量和项目的可维护性。本文探讨了常见JavaScript设计模式及其在Vue.js中的应用。通过具体示例介绍了工厂模式、单例模式和策略模式的应用场景及其实现方法。例如,工厂模式通过`NavFactory`根据用户角色动态创建不同的导航栏组件;单例模式则通过全局事件总线`eventBus`实现跨组件通信;策略模式用于处理不同的表单验证规则。这些设计模式的应用不仅提高了代码的复用性和灵活性,还增强了Vue应用的整体质量。
150 1
Java设计模式-访问者模式(22)
Java设计模式-访问者模式(22)
149 0

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问