您好,欢迎来到华佗小知识。
搜索
您的当前位置:首页前端碰撞室之监听数组的join方法并触发事件

前端碰撞室之监听数组的join方法并触发事件

来源:华佗小知识

大声的告诉我当你看到[1,2,3,4].join你会想到什么。

你有木有想到join是原型链上的方法呢?

你肯定以为我要说以下解决方案

   const join = Array.prototype.join;
    Array.prototype.join = function() {
      console.log("调用了join方法");
      return join.apply(this);
    };
    let arr1 = [1, 2, 3, 4],
      arr2 = [5, 6, 7, 8];
    console.log(arr1.join());
    console.log(arr2.join());
  },

非也非也,上面的特点是所有数组实例都受到了影响

如果只想指定的数组实例受影响呢?

    let arr1 = [1, 2, 3, 4],
      arr2 = [5, 6, 7, 8];
    arr1.join = function() {
      console.log("调用了join方法");
      return Array.prototype.join.apply(this);
    };
    console.log(arr1.join());
    console.log(arr2.join());

体会下面写法

    let arr1 = [1, 2, 3, 4],
      arr2 = [5, 6, 7, 8];

    function wrapper(arr, name) {
      let origin = arr[name];
      return function() {
        console.log("调用了join方法");
        return origin.apply(this);
      };
    }
    arr1.join = wrapper(arr1, "join");
    console.log(arr1.join());
    console.log(arr2.join());

origin === Array.prototype.jointrue

气球.gif

触发自定义事件

    let arr1 = [1, 2, 3, 4],
      arr2 = [5, 6, 7, 8];
    const JOIN_EVENT_NAME = "array.join";
    arr1.join = function() {
      console.log("调用了join方法");
      window.dispatchEvent(new Event(JOIN_EVENT_NAME));
      return Array.prototype.join.apply(this);
    };
    window.addEventListener(JOIN_EVENT_NAME, function() {
      console.log(`触发了${JOIN_EVENT_NAME}`);
    });
    console.log(arr1.join());
    console.log(arr2.join());

Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务