优美编程WEB前端程序开发Web前端之路

监听数组的join方法并触发事件

2020-04-13  本文已影响0人  小遁哥

大声的告诉我当你看到[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());

灵感来源:阿里P7:你了解路由吗?

上一篇 下一篇

猜你喜欢

热点阅读